Zhi*_*ang 5 c++ windows winsock
我正在制作一个程序,它以固定的间隔向服务器发送UDP数据包,如下所示:
while (!stop) {
Sleep(fixedInterval);
send(sock, pkt, payloadSize, flags);
}
Run Code Online (Sandbox Code Playgroud)
然而,由于send
是阻塞呼叫(例如,当fixedInterval
是20ms,并且呼叫send
是> 20ms),因此不能保证周期性.你知道我怎么能把它send
变成一个非阻塞的操作吗?
您需要使用非阻塞套接字.发送/接收功能与阻塞或非阻塞操作的功能相同,但您必须将套接字本身设置为非阻塞.
u_long mode = 1; // 1 to enable non-blocking socket
ioctlsocket(sock, FIONBIO, &mode);
Run Code Online (Sandbox Code Playgroud)
另外,请注意使用非阻塞套接字是完全不同的.你需要确保你成功处理WSAEWOULDBLOCK错误!:)
因此,使用非阻塞套接字可能有所帮助,但仍不能保证确切的时间段.你最好从定时器驱动它,而不是这个简单的循环,这样即使在非阻塞模式下,调用send的任何延迟都不会影响时序.
小智 4
API ioctlsocket 可以做到这一点。您可以按如下方式使用它。但是为什么不在winsock 中使用I/O 模型呢?
ioctlsocket(hsock,FIOBIO,(unsigned long *)&ul);
归档时间: |
|
查看次数: |
11446 次 |
最近记录: |