如何检测 winsock2 中的异常断开连接
How to detect abnormal disconnect in winsock2?
对于非阻塞套接字,我知道如果远程客户端已正常断开连接(假设我们是服务器),recv()
将返回 0 且没有错误代码。您将如何检测异常断开连接?recv()
是否仍返回 0,或者是否有其他方法可以使用 API 来检测这一点?
如果连接物理中断或另一台主机在没有正常关闭套接字的情况下关闭,您的recv
将永远等待。在套接字级别,您可以使用select()
并设置超时,以便等待数据可用于在套接字上读取。 您将在循环中使用它,如果数据可用 - 读取它(recv()
);如果select()
超时,请正常关闭套接字并重新连接。
另一种解决方案是在协议中实现保持活动状态。一端定期发送保持活动状态的消息,另一端有一个设置了超时(调整为发送周期)的计时器并正在等待它们。如果计时器超时,"等待"主机将关闭其套接字并尝试重新连接。
查看 MSDN 的 recv(),尤其是它返回的内容。一切都将揭晓!
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 当套接字连接断开时检测C/C++Unix
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 异常中的字符串已断开
- 如何检测 winsock2 中的异常断开连接
- 从已断开的套接字读取时出现未处理的异常