如何在winsock中"发送"非阻塞

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变成一个非阻塞的操作吗?

use*_*169 9

您需要使用非阻塞套接字.发送/接收功能与阻塞或非阻塞操作的功能相同,但您必须将套接字本身设置为非阻塞.

u_long mode = 1;  // 1 to enable non-blocking socket
ioctlsocket(sock, FIONBIO, &mode);
Run Code Online (Sandbox Code Playgroud)

另外,请注意使用非阻塞套接字是完全不同的.你需要确保你成功处理WSAEWOULDBLOCK错误!:)

因此,使用非阻塞套接字可能有所帮助,但仍不能保证确切的时间段.你最好从定时器驱动它,而不是这个简单的循环,这样即使在非阻塞模式下,调用send的任何延迟都不会影响时序.

  • fcntl()和O_NONBLOCK在Windows上不存在。Windows的O_NONBLOCK等效项是通过ioctlsocket()启用FIONBIO。 (3认同)

小智 4

API ioctlsocket 可以做到这一点。您可以按如下方式使用它。但是为什么不在winsock 中使用I/O 模型呢?

ioctlsocket(hsock,FIOBIO,(unsigned long *)&ul);

  • 您是说 FIONBIO 而不是 FIOBIO 吗? (4认同)