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

Amj*_*ari 5 c

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

代码如下:

struct timespec timeout;

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

result = recvmmsg(fd, datagrams, BATCH_SIZE, 0, &timeout);
Run Code Online (Sandbox Code Playgroud)

Joh*_*nck 5

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

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


R..*_*R.. 5

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