c++ - 如何在 winsock 中使 'send' 非阻塞

标签 c++ windows winsock

我正在制作一个以固定时间间隔向服务器发送 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/

相关文章:

windows - 为什么加载 dll 不需要完整的文件路径?在什么情况下此功能会有用?

c++ - 在非阻塞套接字中选择函数

c++ - 如何以二进制方式读取和发送CR/LF "x0D x0A"

c++ - 错误: no match for call to '(Time) (int, int, int)'

c++ - 从服务器收到几个 100-continue

c++ - 使用 HoughLinesP 进行线检测

php - wkhtmltopdf 窗口错误

c++ - dumpbin/imports 显示的输入地址表和输入名称表是什么?

c++ - 未找到 Netinet 和 netdb,C++ 网络库

c++ - clang-tidy:什么可能导致 NOLINT 评论不被尊重?