我正在研究UDP服务器/客户端应用程序。
为了查明是否有任何客户端关闭,服务器会向客户端发送握手消息。然后,服务器等待客户端的响应以发送一些数据以确保客户端处于活动状态。为此,服务器阻止调用recvfrom()
,除非客户端回复,但如果客户端关闭,服务器将无限制地阻止调用recvfrom()
。
我想在我的服务器上实现这样的功能,以便它在recvfrom()
的调用中等待特定时间(例如2秒)。如果在2秒内没有收到客户端的数据,则认为客户端已死,recvfrom()
返回。
有什么办法吗?我搜索了互联网,但找到了设置MSG_DONTWAIT
标志的解决方案,当没有收到数据时立即返回,但在我的情况下,我不希望recvfrom()
立即返回但是等待特定持续时间的数据,如果没有收到该特定持续时间的数据,则应返回recvfrom()
函数。
答案 0 :(得分:12)
最简单的方法是使用setsockopt()
为相关套接字设置接收超时。
SO_RCVTIMEO
用于此目的。
如果为传递给recvfrom()
的套接字设置了超时,则在超时后如果没有收到数据,该函数将返回。
例如,要设置10个usec读取超时(根据需要在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);
有关详情on Windows please see here,on Linux see here和/或here (POSIX)。