18

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

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

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

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

4

1 回答 1

24

最简单的方法是使用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)

于 2013-04-11T06:21:19.503 回答