我想使用 recvmmsg
调用一次从一个套接字读取多个 UDP 消息。我正在从单个多播组读取数据。
当我读取 TCP 数据时,我通常将 poll/select
与非阻塞套接字(和超时)一起使用,以便在准备好读取数据时得到通知。我采用这种方法,因为我知道虚假唤醒的问题和阻塞套接字的潜在麻烦。
由于我的应用程序必须非常快,如果我采用与 recvmmsg
相同的方法,我将引入一个额外的系统调用 (poll/select
),这可能会减慢执行。
所以我的两个问题如下:
- 使用 UDP,我可以使用
recvmmsg
安全地从 BLOCKING sockets 中读取而不使用poll/select
还是我必须应用与 TCP 相同的原则(非-阻塞+轮询)? - 假设我有大量的多播流量,你会选择非阻塞套接字 +
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/