SENDMMSG - Linux手册页
Linux程序员手册 第2部分
更新日期: 2020-06-09
名称
sendmmsg-在套接字上发送多个消息
语法
#define _GNU_SOURCE /* See feature_test_macros(7) */ #include <sys/socket.h> int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, int flags);
说明
sendmmsg()系统调用是sendmsg(2)的扩展,它允许调用方使用单个系统调用在套接字上传输多个消息。 (这对于某些应用程序具有性能优势。)
sockfd参数是要在其上传输数据的套接字的文件描述符。
msgvec参数是指向mmsghdr结构数组的指针。该数组的大小在vlen中指定。
mmsghdr结构定义为:
struct mmsghdr { struct msghdr msg_hdr; /* Message header */ unsigned int msg_len; /* Number of bytes transmitted */ };
msg_hdr字段是msghdr结构,如sendmsg(2)中所述。 msg_len字段用于返回msg_hdr中消息发送的字节数(即,与单个sendmsg(2)调用的返回值相同)。
flags参数包含在一起进行或运算的标志。这些标志与sendmsg(2)相同。
一个阻塞的sendmmsg()调用将阻塞,直到发送了vlen消息为止。无阻塞呼叫将发送尽可能多的消息(达到vlen指定的限制)并立即返回。
从sendmmsg()返回时,msgvec连续元素的msg_len字段将更新为包含从相应的msg_hdr发送的字节数。调用的返回值指示已更新的msgvec元素的数量。
返回值
成功时,sendmmsg()返回从msgvec发送的消息数;如果此值小于vlen,则调用方可以再次尝试使用sendmmsg()调用来发送其余消息。
如果出错,则返回-1,并且将errno设置为指示错误。
错误说明
错误与sendmsg(2)相同。仅当无法发送数据报时才返回错误。另请参阅错误。
版本
在Linux 3.0中添加了sendmmsg()系统调用。 glibc中的支持已在2.14版中添加。
遵循规范
sendmmsg()是特定于Linux的。
备注
vlen中指定的值以UIO_MAXIOV(1024)为上限。
BUGS
如果在至少发送一条消息后发生错误,则调用成功,并返回发送的消息数。错误代码丢失。呼叫者可以从第一个失败的消息开始重试传输,但是不能保证如果返回错误,它将与前一次呼叫丢失的错误相同。
示例
下面的示例使用sendmmsg()通过一个系统调用在两个不同的UDP数据报中发送onetwo和3。第一个数据报的内容源自一对缓冲区。
#define _GNU_SOURCE #include <netinet/ip.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> int main(void) { int sockfd; struct sockaddr_in addr; struct mmsghdr msg[2]; struct iovec msg1[2], msg2; int retval; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd == -1) { perror("socket()"); exit(EXIT_FAILURE); } addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); addr.sin_port = htons(1234); if (connect(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -1) { perror("connect()"); exit(EXIT_FAILURE); } memset(msg1, 0, sizeof(msg1)); msg1[0].iov_base = "one"; msg1[0].iov_len = 3; msg1[1].iov_base = "two"; msg1[1].iov_len = 3; memset(&msg2, 0, sizeof(msg2)); msg2.iov_base = "three"; msg2.iov_len = 5; memset(msg, 0, sizeof(msg)); msg[0].msg_hdr.msg_iov = msg1; msg[0].msg_hdr.msg_iovlen = 2; msg[1].msg_hdr.msg_iov = &msg2; msg[1].msg_hdr.msg_iovlen = 1; retval = sendmmsg(sockfd, msg, 2, 0); if (retval == -1) perror("sendmmsg()"); else printf("%d messages sent\n", retval); exit(0); }
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。