已经工作了接近一年的时间,工作之余也只能看看书,了解一下相关的技术细节,在网络设备公司不可避免的要和socket打交道,但通常都是调用公司封装好的接口,没有去考虑这些封装背后的工作,回过头来看真的觉得进步很小,我只能逼自己看看书,看看一些好的代码。
sendmsg和recvmsg这两个接口是高级套接口,这两个接口支持一般数据的发送和接收,还支持多缓冲区的报文发送和接收(readv和sendv支持多缓冲区发送和接收),还可以在报文中带辅助数据。这些功能是常用的send、recv等接口无法完成的。
接口的声明如下:
点击(此处)折叠或打开
- #include <sys/socket.h>
-
- ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
- ssize_t sendmsg(int sockfd, struct msghdr *msg, int flags);
点击(此处)折叠或打开
- struct msghdr {
- void *msg_name; /* 消息的协议地址 */
- socklen_t msg_namelen; /* 地址的长度 */
- struct iovec *msg_iov; /* 多io缓冲区的地址 */
- int msg_iovlen; /* 缓冲区的个数 */
- void *msg_control; /* 辅助数据的地址 */
- socklen_t msg_controllen; /* 辅助数据的长度 */
- int msg_flags; /* 接收消息的标识 */
- };
接下来的两个成员是关于接受和发送数据的的。其中的strcut iovec是io向量,如下所示:
点击(此处)折叠或打开
- struct iovec {
- void *io_base; /* buffer空间的基地址 */
- size_t iov_len; /* 该buffer空间的长度 */
- };
msg_control字段的也是指向一段内存,msg_controllen是指该内存的总大小长度,通常该内存被用来存储辅助数据,辅助数据可用于一些特殊的处理。msg_control通常指向一个控制消息头部,其结构体如下所示:
点击(此处)折叠或打开
- struct cmsghdr {
- socklen_t cmsg_len; /* 包含该头部的数据长度 */