linux提供的sendmsg接口主要是为了满足哪种类型的需求
passing file descriptor to another process.
■网友
因为进程间传递文件描述符不能直接用传递数字的方法。所以需要sendmsg
■网友
【linux提供的sendmsg接口主要是为了满足哪种类型的需求】 我们项目中用sendmsg有一种玩法还不错,就是我们的协议包,包头可能要包几层的情况,用sendmsg会很方便。ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);这里看下msghdr的结构struct msghdr { void *msg_name; /* optional address */ socklen_t msg_namelen; /* size of address */ struct iovec *msg_iov; /* scatter/gather array */ size_t msg_iovlen; /* # elements in msg_iov */ void *msg_control; /* ancillary data, see below */ size_t msg_controllen; /* ancillary data buffer len */ int msg_flags; /* flags (unused) */};重点就在msg_iov了struct iovec iov = {\t{.iov_base=(void*)proxy_hdr, .iov_len= IPC_HEADER_SZ}, {.iov_base=(void*)\u0026amp;trans_hdr, .iov_len= TRANMIT_HEADER_SZ},\t{.iov_base=(void*)buf, .iov_len=len }};这里我们发送的数据是buf,然后我们会在buf前面封装两层包头,一个是proxy_hdr,一个是trans_hdr,直接调用一次sendmsg就完成了。
如果使用send直接发送的话,正常流程是定义一个buffer,先memcpy把proxy_hdr放进buffer,再memcpy把trans_hdr放进buffer,然后把buf的数据放进buffer,最后调用send发送buffer,总结起来就是3次memcpy加一次send,比起一次sendmsg多了3次系统调用。
推荐阅读
- 山东多家餐馆推出“套餐A”为困难民众提供免费“爱心面”
- 「技能」首届全国技能大赛江苏勇夺第二为经济高质量发展提供人才保障
- 午餐■小“膳”大爱,这场大学慈善摄影展为千余名山区儿童提供免费午餐
- 怎样评价3月10日起外资企业不能在中国大陆提供视听服务这一消息
- 现代名图|全新一代名图,比速腾帅长近4米8,提供2种动力,或卖15万内
- 思域|全新一代国产本田思域有望明年中旬发布 将提供混动车型
- win10激活的问题
- 汽车娱生活|三菱欧蓝德降至13.98万,提供7座版本+四驱系统
- 网通社|标配运动套件 提供两种动力选择 新款Q7正式上市/售价68.88万起
- 哪些平台有提供开屏广告?
