recvmsg
函数是Unix和Linux操作系统中用于接收消息的 socket API。它是一个更为通用和复杂的接收函数,与recv
相比,recvmsg
提供了更多的控制选项,允许用户接收带有辅助数据(ancillary data)的消息。
recvmsg
函数的原型定义在<sys/socket.h>
头文件中,其函数原型如下:
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
参数说明:
sockfd
:指定接收消息的socket文件描述符。msg
:指向msghdr
结构的指针,该结构包含了消息的相关信息。flags
:指定函数行为的标志,比如是否阻塞等,常见的标志有:MSG_WAITALL
:等待直到接收到指定大小的数据。MSG_DONTWAIT
:设置为非阻塞模式。MSG_PEEK
:查看消息但不从队列中移除。
msghdr
结构的定义如下:
struct msghdr {
void *msg_name; /* optional address */
socklen_t msg_namelen; /* size of address */
struct iovec *msg_iov; /* scatter/gather array */
int msg_iovlen; /* # elements in msg_iov */
void *msg_control; /* ancillary data, see below */
socklen_t msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */
};
字段说明:
msg_name
:指向 socket 地址结构的指针,用于返回发送方的地址信息。msg_namelen
:发送方地址结构的长度。msg_iov
:指向iovec
结构的数组,用于指定接收缓冲区。msg_iovlen
:msg_iov
指向的数组中元素的数量。msg_control
:指向辅助数据的指针,可以用来接收额外的消息,如文件描述符。msg_controllen
:辅助数据的大小。msg_flags
:接收到的消息的标志,由内核填写。
recvmsg
函数通常用于接收UDP或多播数据,也常用于接收带外数据(out-of-band data)或者文件描述符。使用recvmsg
可以接收多段数据到不同的缓冲区,并且可以处理辅助数据,这使得它在处理复杂的网络协议时非常有用。
当recvmsg
成功时,它返回接收到的字节数。如果连接被对方优雅地关闭,则返回0。失败时,返回-1,并设置errno
以指示错误原因。