如何检测 winsock2 中的异常断开连接

How to detect abnormal disconnect in winsock2?

本文关键字:异常 断开 连接 winsock2 何检测 检测      更新时间:2023-10-16

对于非阻塞套接字,我知道如果远程客户端已正常断开连接(假设我们是服务器),recv()将返回 0 且没有错误代码。您将如何检测异常断开连接?recv()是否仍返回 0,或者是否有其他方法可以使用 API 来检测这一点?

如果连接物理中断或另一台主机在没有正常关闭套接字的情况下关闭,您的recv将永远等待。在套接字级别,您可以使用select()并设置超时,以便等待数据可用于在套接字上读取。 您将在循环中使用它,如果数据可用 - 读取它(recv());如果select()超时,请正常关闭套接字并重新连接。

另一种解决方案是在协议中实现保持活动状态。一端定期发送保持活动状态的消息,另一端有一个设置了超时(调整为发送周期)的计时器并正在等待它们。如果计时器超时,"等待"主机将关闭其套接字并尝试重新连接。

查看 MSDN 的 recv(),尤其是它返回的内容。一切都将揭晓!