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