我正在制作一个程序,它以固定的时间间隔将 UDP 数据包发送到服务器,如下所示:
while (!stop) {
Sleep(fixedInterval);
send(sock, pkt, payloadSize, flags);
}
send
然而,由于是阻塞调用(例如,whenfixedInterval
是 20ms,而调用send
是 > 20ms ) ,因此无法保证周期性。你知道我怎样才能把它send
变成一个非阻塞操作吗?
您需要使用非阻塞套接字。发送/接收函数与阻塞或非阻塞操作的函数相同,但您必须将套接字本身设置为非阻塞。
u_long mode = 1; // 1 to enable non-blocking socket
ioctlsocket(sock, FIONBIO, &mode);
另外,请注意,使用非阻塞套接字是完全不同的。您需要确保成功处理 WSAEWOULDBLOCK 错误!:)
因此,使用非阻塞套接字可能会有所帮助,但仍不能保证准确的时间。您最好从计时器驱动它,而不是这个简单的循环,这样调用发送的任何延迟,即使在非阻塞模式下,也不会影响时间。
API ioctlsocket 可以做到。你可以如下使用它。但是你为什么不在winsock中使用I/O模型呢?
ioctlsocket(hsock,FIOBIO,(unsigned long *)&ul);
我的记忆在这里很模糊,因为我使用 UDP 非阻塞可能已经有 15 年了。
但是,您应该注意一些事项。
如何测量发送所花费的时间,然后只是休眠丢失的时间长达 20 毫秒?