3

我设置了一个 udp 套接字,并在每次通话时使用不同的收件人调用 sendto()。

我想使用 writev() 来使 scater/gather io 受益,但 writev() 不允许我像在 sendto() 中那样指定收件人地址/端口。有什么建议么?

4

2 回答 2

3

在 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。

于 2019-11-21T16:18:47.990 回答
2

如果您使用预先指定端点,则可以使用writev将一组合并的缓冲区发送到单个端点。connect来自(OSX)手册页connect(2)

数据报套接字可以多次使用 connect() 来改变它们的关联

不能使用writev将每个缓冲区发送到不同的端点。

使用connect / writev而不是sendto* n的一个潜在缺点是它是另一个系统调用writev

如果接收者的集合是有限的(并且事先知道),则最好为socket每个接收者使用一个单独的,并且connect每个套接字只使用一次。

于 2013-12-03T15:49:51.920 回答