1

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

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

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

所以我的两个问题如下:

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

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

4

2 回答 2

1

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

如果您想强加读取超时,则可以setsockopt()使用该SO_RCVTIMEO选项。

我遵循这种方法,因为我知道虚假唤醒的问题

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

以及阻塞套接字的潜在问题。

从来没有听说过那些。

除非select()您的平台不支持SO_RCVTIMEO. 首先,这是一个额外的系统调用。

于 2015-08-21T06:35:53.013 回答
0

使用阻塞或非阻塞的选项取决于应用程序的最终目的是什么。- 假设它只是一个显示 UDP 与 TCP 结合使用的示例聊天应用程序,那么您可以使用其中任何一个。- 但是,如果您打算将此模块作为具有大量数据流动的高度使用的应用程序的一部分,那么创建多个线程/进程来处理不同的任务可能会派上用场。父线程将等待消息,但为了处理它将产生一个不同的子线程,从而使父线程可用于下一条消息。

poll/select但简而言之,考虑到它只是出于家庭作业的目的,我认为您使用阻塞套接字而不用于 UDP 应用程序的第一个选项没有任何问题。

于 2015-08-21T06:53:43.083 回答