Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 组合sento()write writev()?_Linux_Sockets_Networking_Udp_Sendto - Fatal编程技术网

Linux 组合sento()write writev()?

Linux 组合sento()write writev()?,linux,sockets,networking,udp,sendto,Linux,Sockets,Networking,Udp,Sendto,我设置了一个udp套接字,并在每次调用时使用不同的收件人调用sendto() 我想使用writev()来帮助scater/gather io,但writev()不允许我在sendto()中指定收件人地址/端口。有什么建议吗?如果使用connect预先指定终点,则可以使用writev将合并的缓冲区集发送到单个终点。从连接(2)的(OSX)手册页: 数据报套接字可以多次使用connect()来更改其关联 不能使用writev将每个缓冲区发送到不同的端点 使用connect/writev而不是send

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


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

如果使用
connect
预先指定终点,则可以使用
writev
将合并的缓冲区集发送到单个终点。从
连接(2)
的(OSX)手册页:

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

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

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


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

在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
中指定的,因此您可以发送到多个目的地并使用分散/聚集。

您希望在每个
writev
调用中使用多个收件人,还是只使用一个?@Alnitak每次调用writev()只使用一个收件人。如果收件人集有限(并且提前知道)每个接收者使用一个单独的套接字,只需连接每个套接字一次,可能更可取。”->哦,是的,对了,这就是我们现在要做的。Thnx!