我想使用recvmmsg
调用一次从一个单个套接字读取多个UDP消息。我正在从单个多播组中读取数据。
当我读取TCP数据时,我通常使用带有非阻塞套接字(和超时)的poll/select
,以便在准备好读取时通知它。我遵循这种方法,因为我知道虚假唤醒的问题以及阻塞套接字的潜在麻烦。
由于我的应用程序必须非常快,如果我对recvmmsg
采用相同的方法,我将引入额外的系统调用(poll/select
),这可能会减慢执行速度。
所以我的两个问题如下:
recvmmsg
无poll/select
安全地读取BLOCKING套接字,还是必须应用我用于TCP(非阻塞+轮询)的相同原则? recvmmsg
吗(没有民意调查)并烧掉大量的CPU?我正在使用Linux:CentOS 7和Oracle Linux。
答案 0 :(得分:1)
您始终可以使用阻止模式,同时使用TCP和UDP套接字。
如果您要强制执行读取超时,setsockopt()
选项会SO_RCVTIMEO
。
我遵循这种方法,因为我知道虚假唤醒的问题
什么虚假唤醒?在25年的网络编程中从未见过它。
以及阻塞插座的潜在麻烦。
从未听说过这些。
使用select()
和非阻塞模式与单个套接字是没有意义的,除非您的平台不支持SO_RCVTIMEO
。这是一个额外的系统调用,一开始。
答案 1 :(得分:0)
使用阻止或非阻塞的选项取决于应用程序的最终目的。 - 假设它只是一个示例聊天应用程序,显示UDP与TCP结合使用,然后您可以使用其中任何一个。 - 但是,如果您计划将此模块作为高度使用的应用程序的一部分,并且有大量数据流动,则可能会创建多个线程/进程来处理不同的任务。父线程将等待消息,但是为了进行处理,它将产生一个不同的子线程,从而使父节点可用于下一条消息。
但简而言之,我认为在没有poll/select
的情况下使用阻塞套接字的第一个选项对于UDP应用程序没有任何问题,因为它仅用于作业目的。