作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在制作一个以固定时间间隔向服务器发送 UDP 数据包的程序,如下所示:
while (!stop) {
Sleep(fixedInterval);
send(sock, pkt, payloadSize, flags);
}
但是周期性无法保证,因为 send
是一个阻塞调用(例如,当 fixedInterval
为 20 毫秒,而对 send
的调用是> 20 毫秒)。您知道如何将 send
变成非阻塞操作吗?
最佳答案
您需要使用非阻塞套接字。发送/接收函数与阻塞或非阻塞操作的函数相同,但您必须将套接字本身设置为非阻塞。
u_long mode = 1; // 1 to enable non-blocking socket
ioctlsocket(sock, FIONBIO, &mode);
此外,请注意使用非阻塞套接字是完全不同的。您需要确保成功处理 WSAEWOULDBLOCK 错误! :)
因此,使用非阻塞套接字可能会有所帮助,但仍不能保证准确的时间段。你最好从计时器而不是这个简单的循环中驱动它,这样调用发送的任何延迟,即使在非阻塞模式下,也不会影响计时。
关于c++ - 如何在 winsock 中使 'send' 非阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17227092/
我是一名优秀的程序员,十分优秀!