我使用使用recvmmsg()
的c构建一个简单的应用程序,传递的第五个参数是type struct timespec
的超时。我将超时设置为5秒,但它不起作用,它会阻塞无限。
代码如下:
struct timespec timeout;
timeout.tv_sec = 5;
timeout.tv_nsec = 0;
result = recvmmsg(fd, datagrams, BATCH_SIZE, 0, &timeout);
答案 0 :(得分:5)
见这里:http://permalink.gmane.org/gmane.linux.man/3440
基本上,timeout参数指定等待更多消息的最长时间,但基础接收操作仍然是阻塞的。因此,如果您将超时设置为5秒并且每秒接收一条消息,则在接收(大约)5条消息后它将停止,即使缓冲区中有更多空间也是如此。如果根本没有数据,它不会在5秒后返回。为此,您应该使用常用机制之一,例如select()或epoll()超时,或忙等待等。
答案 1 :(得分:5)
作为替代方法,您可以使用setsockopt
和SO_RCVTIMEO
选项在套接字上设置超时。这将影响对其执行的所有读取操作。
答案 2 :(得分:0)
recvmmsg实现中存在错误:
注意,pselect
允许您检查数据是否可用。但是,它不保证recvmmsg
不会永远等待。因此,请勿使用此方法。
我建议您使用SO_RCVTIMEO
添加recvmmsg的timeout
参数。如果自SO_RCVTIMEO
之后或timeout
之后未收到任何数据,recvmmsg将退出。在最坏的情况下,recvmmsg将在timeout
+ SO_RCVTIMEO
之后退出(在timeout
结束之前收到数据并且没有数据再次到达的情况。)