我已经设置了一个udp套接字,并在每次调用时使用不同的收件人调用sendto()。
我想使用writev()以使scater / gather io受益,但writev()不允许我像sendto()那样指定收件人地址/端口。有什么建议吗?
答案 0 :(得分:2)
如果使用 数据报套接字可以多次使用connect()来更改其关联 你无法使用 使用 如果收件人集受限(并且事先已知),则最好每个收件人使用单独的writev
预先指定结束点,则可以使用connect
将合并的缓冲区集发送到单个端点。来自connect(2)
的
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向量,因此您既可以发送到多个目的地,又可以使用分散/收集。