繁体   English   中英

使 recvfrom() 函数非阻塞

[英]Making recvfrom() function non-blocking

我正在开发 UDP 服务器/客户端应用程序。

为了查明是否有任何客户端宕机,服务器会向客户端发送握手消息。 然后,服务器等待客户端的响应发送一些数据以确保客户端处于活动状态。 为此,除非客户端回复,否则服务器会阻止对recvfrom()调用,但如果客户端关闭,则服务器会无限地阻止对recvfrom()调用。

我想在我的服务器上实现这样的功能,以便它在对recvfrom()的调用中等待特定时间(比如 2 秒)。 如果在 2 秒内没有从客户端接收到数据,则认为客户端已死并且recvfrom()返回。

有什么办法吗? 我搜索了互联网,但找到了解决方案,例如设置MSG_DONTWAIT标志,该标志在未收到数据时立即返回,但在我的情况下,我不希望recvfrom()立即返回,而是在特定的时间段内等待数据,并且在未收到数据时在那个特定的持续时间内, recvfrom()函数应该返回。

最简单的方法是使用setsockopt()为相关套接字设置接收超时。

SO_RCVTIMEO用于此目的。

如果为传递给recvfrom()的套接字设置了超时,则该函数在此超时后返回,如果没有收到数据。

例如,要设置 10 μs 读取超时(根据需要对setsockopt()返回的值添加错误检查):

#include <sys/types.h> 
#include <sys/socket.h>

...

struct timeval read_timeout;
read_timeout.tv_sec = 0;
read_timeout.tv_usec = 10;
setsockopt(socketfd, SOL_SOCKET, SO_RCVTIMEO, &read_timeout, sizeof read_timeout);

有关Windows 的详细信息,请参阅此处在 Linux 上,请参阅此处和/或此处 (POSIX)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM