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

时间:2013-05-02 14:57:55

标签: c

我使用使用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);

3 个答案:

答案 0 :(得分:5)

见这里:http://permalink.gmane.org/gmane.linux.man/3440

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

答案 1 :(得分:5)

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

答案 2 :(得分:0)

recvmmsg实现中存在错误:

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

我建议您使用SO_RCVTIMEO添加recvmmsg的timeout参数。如果自SO_RCVTIMEO之后或timeout之后未收到任何数据,recvmmsg将退出。在最坏的情况下,recvmmsg将在timeout + SO_RCVTIMEO之后退出(在timeout结束之前收到数据并且没有数据再次到达的情况。)