linux - 结合sento()写writev()?

标签 linux sockets networking udp sendto

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

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

最佳答案

在 Linux 上,有 sendmmsg(2)

The sendmmsg() system call is an extension of sendmsg(2) that allows the caller to transmit multiple messages on a socket using a single system call. (This has performance benefits for some applications.)

原型(prototype)是:

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

关于linux - 结合sento()写writev()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20355565/

相关文章:

linux - merge 远程仓库提交到本地

c - 我无法在Ubuntu 11.10中编译C程序。

linux - 退出的意义

java - 可区分的套接字输入

C套接字编程通过同一连接发送多个发送和接收

c - 为什么 getsockopt 返回错误?

c - 是否可以通过 TCP 进行广播?

c++ - 如何在运行时确定消息类型?

linux - tmux:以编程方式水平拆分窗口并运行两个命令?

networking - 带有 VS Code 的企业代理返回 ECONNREFUSED