我正在制作一个程序,它以固定的间隔向服务器发送UDP数据包,如下所示:
while (!stop) {
Sleep(fixedInterval);
send(sock, pkt, payloadSize, flags);
}
但是无法保证周期性,因为send
是阻止通话(例如,当fixedInterval
为20毫秒,而对send
的通话大于20毫秒)。你知道如何将send
变成非阻塞操作吗?
答案 0 :(得分:7)
您需要使用非阻塞套接字。发送/接收功能与阻塞或非阻塞操作的功能相同,但您必须将套接字本身设置为非阻塞。
u_long mode = 1; // 1 to enable non-blocking socket
ioctlsocket(sock, FIONBIO, &mode);
另外,请注意使用非阻塞套接字是完全不同的。你需要确保你成功处理WSAEWOULDBLOCK错误! :)
因此,使用非阻塞套接字可能有所帮助,但仍不能保证确切的时间段。你最好从计时器驱动它,而不是这个简单的循环,这样即使在非阻塞模式下,调用send的任何延迟都不会影响时间。
答案 1 :(得分:3)
API ioctlsocket可以做到。你可以使用它如下。但是你为什么不在winsock中使用I / O模型?
ioctlsocket(hsock,FIOBIO,(unsigned long *)& ul);
答案 2 :(得分:0)
我的记忆很模糊,因为我使用UDP非阻塞可能需要15年。
但是,有些事情你应该知道。
答案 3 :(得分:-1)
如何测量发送时间,然后只是睡觉时缺少20毫秒?