如何在 winsock 中使'send'无阻塞
How to make 'send' non-blocking in winsock
我正在制作一个程序,它以固定的间隔向服务器发送UDP数据包,类似于以下内容:
while (!stop) {
Sleep(fixedInterval);
send(sock, pkt, payloadSize, flags);
}
然而,由于send
是阻塞调用(例如,当fixedInterval
为20ms,并且对send
的调用>20ms时),因此不能保证周期性。你知道我如何将send
变成非阻塞操作吗?
您需要使用非阻塞套接字。发送/接收函数与阻塞或非阻塞操作的函数相同,但必须将套接字本身设置为非阻塞。
u_long mode = 1; // 1 to enable non-blocking socket
ioctlsocket(sock, FIONBIO, &mode);
另外,请注意,使用非阻塞套接字是完全不同的。您需要确保成功处理WSAEWOULDBLOCK错误!:)
因此,使用非阻塞套接字可能会有所帮助,但仍然不能保证确切的周期。您最好从计时器驱动,而不是这个简单的循环,这样调用send的任何延迟,即使在非阻塞模式下,也不会影响计时。
API ioctlsocket可以做到这一点。您可以按如下方式使用它。但为什么不在winsock中使用I/O模型?
ioctlsocket(hsock,FIOBIO,(unsigned long *)&ul);
我的记忆很模糊,因为我使用UDP非阻塞可能已经15年了。
然而,有些事情你应该注意。
-
如果你要通过公共网络,只发送少量的数据包。如果客户端或服务器没有被编写来处理不完整的数据包,那么PATH MTU可能会让您绊倒。
-
请确保检查您是否已发送您认为必须发送的字节数。当你期望看到300个字节被发送,而接收端只得到248个时,这可能会变得很奇怪。客户端和服务器端都必须意识到这个问题。
-
请参阅此处,了解Linux用户的一些好建议。
-
请参阅此处了解UDP 的Unix套接字常见问题解答
-
这是一个很好的、通用的网络编程常见问题解答和示例页面。
测量发送所需的时间,然后将丢失的时间睡眠到20ms怎么样?
- 是否可以在C++中使变量真正只读
- 在C++中使用线程查找友好号码比单个线程花费更多时间
- QDateTime::toString() 在退出处理程序中使用时失败
- Qt::D irectConnection在多线程环境中使用时如何工作?
- G++ 在生成文件中使用时停止工作
- 在C++中使虚拟函数私有化
- 为什么"non-standard syntax; use '&' to create a pointer to member"在 CTOR 中使用线程?
- PyFunctionObject 在 Py_Finalize 中使程序崩溃,如果它在 PyTuple 中被设置了项目
- 当在循环中使用时,std::shared_ptr 对该循环的矢量化有任何影响吗?
- QTranslator 在 if 语句中使用时不起作用
- 当变量在多个函数作用域中使用时,我应该在类 private 中声明该变量吗?
- 从转码示例中使用时,比例过滤器会带有错误崩溃
- 在构造函数中使用时如何使用 ->?
- 提升序列化仅适用于主要?当我在其他对象中使用时,继续说"has no member named ‘serialize’"
- 在解决方案中的项目中使用时缺少 NuGet 包
- 在命名空间内的 lambda 中使用时未找到运算符重载
- 如何使用 std::vector 在 c++11 中使其更快?
- 在头文件中使用时无法识别结构
- 在单个进程中使Qt顶级窗口被其他非Qt窗口"owned"
- 如何在 winsock 中使'send'无阻塞