如何检测winsock2中的异常断开?

时间:2012-04-17 17:58:47

标签: c++ winsock

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

2 个答案:

答案 0 :(得分:2)

如果连接物理断开或其他主机已关闭而未正常关闭套接字,则recv将永远等待。在套接字级别,您可以使用select()并设置超时,以便在套接字上读取等待数据。你将在一个循环中有这个,如果数据可用 - 读它(recv());如果select()超时,请正常关闭套接字并重新连接。

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

答案 1 :(得分:-2)

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

相关问题