【问题标题】:Receiving multiple datagrams in a single system call在单个系统调用中接收多个数据报
【发布时间】:2013-07-17 13:37:46
【问题描述】:

在 Linux 上,除非我弄错了,否则应用程序可以使用套接字调用系列在数据报传输中一次发送或接收一个数据包。

想知道 Linux 是否为应用程序提供了一种在数据报传输上一次调用中发送和接收多个数据包的方法。

【问题讨论】:

  • 它不是由 BSD API 提供的(这就是你所说的“套接字调用族”)。
  • 在 linux 上你可能想看看 sendmmsg 系统调用

标签: linux network-programming


【解决方案1】:

使用 recvmmsg 接收多个数据报包(例如 UDP)

int recvmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
                    unsigned int flags, struct timespec *timeout);
DESCRIPTION         
   The recvmmsg() system call is an extension of recvmsg(2) that allows
   the caller to receive multiple messages from a socket using a single
   system call. ...

http://man7.org/linux/man-pages/man2/recvmmsg.2.html

使用 sendmmsg 发送...

int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
                    unsigned int flags);
DESCRIPTION        
   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.

http://man7.org/linux/man-pages/man2/sendmmsg.2.html

【讨论】:

    【解决方案2】:

    Linux 上没有这样的调用。但是,根据您的需要,还有其他选择:

    【讨论】:

    • 目前,我正在使用 io_*() 系列异步 IO 调用来解决我的目的。异步 IO 有点作弊,但它有助于一次发送/接收多个数据包。
    猜你喜欢
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多