结合sento()写writev()?

时间:2013-12-03 15:47:46

标签: linux sockets networking udp sendto

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

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

2 个答案:

答案 0 :(得分:2)

如果使用writev预先指定结束点,则可以使用connect将合并的缓冲区集发送到单个端点。来自connect(2)

  

数据报套接字可以多次使用connect()来更改其关联

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

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

如果收件人集受限(并且事先已知),则最好每个收件人使用单独的socket,每个套接字只需connect一次。

答案 1 :(得分:1)

在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 */
};

由于在struct msghdr中同时指定了地址和I / O向量,因此您既可以发送到多个目的地,又可以使用分散/收集。