我设置了一个 udp 套接字,并在每次通话时使用不同的收件人调用 sendto()。
我想使用 writev() 来使 scater/gather io 受益,但 writev() 不允许我像在 sendto() 中那样指定收件人地址/端口。有什么建议么?
我设置了一个 udp 套接字,并在每次通话时使用不同的收件人调用 sendto()。
我想使用 writev() 来使 scater/gather io 受益,但 writev() 不允许我像在 sendto() 中那样指定收件人地址/端口。有什么建议么?
在 Linux 上,有sendmmsg(2)
sendmmsg() 系统调用是 sendmsg(2) 的扩展,它允许调用者使用单个系统调用在套接字上传输多条消息。(这对某些应用程序具有性能优势。)
原型是:
int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
unsigned int flags);
struct mmsghdr {
struct msghdr msg_hdr; /* Message header */
unsigned int msg_len; /* Number of bytes transmitted */
};
由于地址和 i/o 向量都在 中指定struct msghdr
,因此您既可以发送到多个目的地,也可以使用 scatter/gather。
如果您使用预先指定端点,则可以使用writev
将一组合并的缓冲区发送到单个端点。connect
来自(OSX)手册页connect(2)
:
数据报套接字可以多次使用 connect() 来改变它们的关联
您不能使用writev
将每个缓冲区发送到不同的端点。
使用connect / writev
而不是sendto
* n的一个潜在缺点是它是另一个系统调用writev
。
如果接收者的集合是有限的(并且事先知道),则最好为socket
每个接收者使用一个单独的,并且connect
每个套接字只使用一次。