使recvfrom()函数无阻塞

Ays*_*yse 12 c sockets winapi udp network-programming

我正在研究UDP服务器/客户端应用程序.

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

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

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

alk*_*alk 14

最简单的方法是使用setsockopt()为有问题的套接字设置接收超时.

SO_RCVTIMEO 用于此.

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

例如,设置10 usec读取超时(setsockopt()根据需要在returnvalue上添加错误检查):

#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);
Run Code Online (Sandbox Code Playgroud)

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

  • 或者使用`select()`等待套接字在超时内进入可读状态,只有当套接字实际可读时才调用`recvfrom()`,表示数据可供读取. (7认同)