c - 使 recvfrom() 函数成为非阻塞的

标签 c sockets winapi network-programming udp

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

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

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

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

最佳答案

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

SO_RCVTIMEO 用于此目的。

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

例如,要设置 10 微秒的读取超时(根据需要对 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) .

关于c - 使 recvfrom() 函数成为非阻塞的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15941005/

相关文章:

c++ - Qt/Windows,可调整大小的无框窗口

c++ - 尝试执行任何需要它时无法修复 WinAPI 中的 "invalid handle"错误

C 动态链接到共享库抑制/处理 "cannot open shared object file" fatal error ,并继续链接

c# - 当 .Net Sockets Keep Alive 没有收到确认时会引发什么事件?

python - 在 Python 中读取 UDP 数据包的缓冲区大小

linux - 拦截传输层之上的流量

有人可以告诉我为什么我的链接列表无法正确显示吗? (C语言编程)

c++ - MongoDB C 驱动程序 : how to use regex query collection?

c - 从 C 中的函数返回后变量值发生变化

c++ - 如何播放视频?