2012-04-17 223 views
0

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

+0

查看MSDN的recv(),尤其是它返回的内容。所有将被揭示! – 2012-04-17 18:09:27

回答

2

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

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

+0

好点 - 如果这是OP意味着“异常断线”,他/她可能会等待很长很长一段时间.. – 2012-04-17 18:47:14

-2

查看MSDN的recv(),尤其是它返回的内容。所有将被揭示!

+0

请注意,'异常断线'<>无断线!如果网络电缆脱离对等体,并且您不尝试发送任何数据(即您正在等待数据),您可以永远等待,正如@Bojan指出的那样 – 2012-04-17 18:45:57

+0

请仔细阅读我的问题;我询问异常断开(或非正常断开连接)。 recv()文件在_graceful_断开期间返回0。 – 2012-04-17 19:22:27

+0

服务器'正在离开'不是从客户端POV异常断开连接。 WSAECONNRESET,WSAETIMEDOUT或WSAECONNABORTED是非正常断开连接,由WSAGetLastError()返回,并且SOCKET_ERROR返回了rec​​v()。半连接没有异常断开。 – 2012-04-17 21:47:56

相关问题