c - 无需轮询即可读取多条 UDP 消息

标签 c linux sockets multicast recvmmsg

我想使用 recvmmsg 调用一次从一个套接字读取多个 UDP 消息。我正在从单个多播组读取数据。

当我读取 TCP 数据时,我通常将 poll/select 与非阻塞套接字(和超时)一起使用,以便在准备好读取数据时得到通知。我采用这种方法,因为我知道虚假唤醒的问题和阻塞套接字的潜在麻烦。

由于我的应用程序必须非常快,如果我采用与 recvmmsg 相同的方法,我将引入一个额外的系统调用 (poll/select),这可能会减慢执行。

所以我的两个问题如下:

  1. 使用 UDP,我可以使用 recvmmsg 安全地从 BLOCKING sockets 中读取而不使用 poll/select 还是我必须应用与 TCP 相同的原则(非-阻塞+轮询)?
  2. 假设我有大量的多播流量,你会选择非阻塞套接字 + recvmmsg 仅(无轮询)并消耗大量 CPU 吗?

我正在使用 Linux:CentOS 7 和 Oracle Linux。

最佳答案

您始终可以对 TCP 和 UDP 套接字使用阻塞模式。

如果你想强制读取超时,可以使用带有 SO_RCVTIMEO 选项的 setsockopt()

I follow this approach as I am aware of the issue of spurious wakeup

什么虚假唤醒?在 25 年的网络编程中从未见过它。

and potential troubles of having a blocking socket.

也从未听说过这些。

使用select() 和单套接字的非阻塞模式是没有意义的,除非你的平台不支持SO_RCVTIMEO。首先,这是一个额外的系统调用。

关于c - 无需轮询即可读取多条 UDP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32133791/

相关文章:

c++ - 使用 MinGW 在 Windows 上编译到 Linux?

linux - 在两个单独的步骤中使用 DMD : Linking 64-bit (Linux)

将数组的指针更改为更大的数组

c - 逐行读取的 shell

linux - 如何使用shell变量更改特定位置的字符

linux - 如何在 curl 上指定 IP 地址?

java - 在不关闭套接字的情况下使用 java.nio.* 中断 InputStream#read() 的任何方法?

Python 套接字模块。连接到 HTTP 代理然后对外部资源执行 GET 请求

sockets - 带有 addrinfo 结构的智能指针

iphone - 使用 OpenGL ES 2.0 显示/处理 iPhone 相机帧