Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在recvmmsg()中设置超时?_C - Fatal编程技术网

如何在recvmmsg()中设置超时?

如何在recvmmsg()中设置超时?,c,C,我使用c构建了一个简单的应用程序,它使用了recvmmsg(),传递的第五个参数是类型struct timespec的timeout。我将超时设置为5秒,但它不工作,它会无限阻塞 代码如下: struct timespec timeout; timeout.tv_sec = 5; timeout.tv_nsec = 0; result = recvmmsg(fd, datagrams, BATCH_SIZE, 0, &timeout); 请看这里: 基本上,timeout参数指定

我使用c构建了一个简单的应用程序,它使用了
recvmmsg()
,传递的第五个参数是
类型struct timespec
的timeout。我将超时设置为5秒,但它不工作,它会无限阻塞

代码如下:

struct timespec timeout;

timeout.tv_sec =  5;
timeout.tv_nsec = 0;

result = recvmmsg(fd, datagrams, BATCH_SIZE, 0, &timeout);
请看这里:


基本上,timeout参数指定了等待更多消息的最长时间,但底层接收操作仍在阻塞。因此,如果您将超时设置为5秒,并且每秒接收一条消息,那么即使缓冲区中有足够的空间容纳更多消息,它也会在接收(大约)5条消息后停止。它不会做的是在5秒后返回,如果根本没有数据。为此,您应该使用一种常见的机制,如select()或epoll()带超时,或忙等待等。

作为替代方法,您可以使用
setsockopt
with
SO\u RCVTIMEO
选项在套接字上设置超时。这将影响对其执行的所有读取操作。

recvmmsg实现中存在错误:

请注意,
pselect
允许您检查数据是否可用。但是,它不能保证
recvmmsg
不会永远等待。因此,不要使用这种方法


我建议您在recvmmsg的
timeout
参数中添加
sorcvtimeo
。如果自
sorcvtimeo
超时后未收到数据,recvmmsg将退出。在最坏的情况下,recvmmsg将在
超时后退出
+
,因此_RCVTIMEO
(在
超时即将结束之前接收到数据,并且不再有数据到达的情况下)。

这里有一个可能相关的错误提示:@Vicky:差不多正确——类似于我回答中的链接。然而,目前还不清楚是否有人会改变这种行为——很可能这会被视为文档错误,手册页将被更新,而几乎无用的超时参数将不会被大多数应用程序使用。在上面的链接中,使用select还有另一个解决方案:我真的无法想象一个有用且有用的用例。从这个答案的链接中,我发现一个引用非常具有说明性“recvmmsg()有一个显式的timeout参数,但它看起来工作不正常,文档中也没有提到它应该如何与SO_RCVTIMEO交互。“这很有帮助,因为它解释了如果需要
recvmmsg(),为什么必须设置套接字的
SO_RCVTIMEO
参数
timeout参数不能无限期阻塞。(我的recvmmsg测试代码(来自
man recvmmsg
)会无限期阻塞,超时时间为1秒。如果设置套接字的SO_RCVTIMEO,则它不会无限期阻塞。)