7

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

3 回答 3

6

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

于 2013-05-02T15:23:41.357 回答
5

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

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

于 2013-05-02T15:12:53.750 回答
0

recvmmsg 实现中存在错误:

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

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

于 2015-03-04T09:34:12.010 回答