0

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

4

2 回答 2

2

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

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

于 2012-04-17T18:23:06.873 回答
-2

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

于 2012-04-17T18:12:26.043 回答