对于非阻塞套接字,如果远程客户端已正常断开连接(假设我们是服务器),则知道recv()
将返回0且没有错误代码。你会如何检测异常断开? recv()
仍然会返回0,还是有其他方法可以使用API来检测这个?如何检测winsock2中的异常断开连接?
回答
如果连接断开或其他主机关闭而没有正常关闭套接字,您的recv
将永远等待。在套接字级别,您可以使用select()
并设置超时以使等待数据可用于在套接字上读取。你会有这个循环,如果数据可用 - 读它(recv()
);如果select()
超时,请正常关闭套接字并重新连接。
另一个解决方案是在你的协议中实现保活。一方正在周期性地发送保持活动消息,另一方具有设置了超时的定时器(调整为发送周期)并等待它们。如果定时器超时,“等待”主机关闭其套接字并尝试重新连接。
好点 - 如果这是OP意味着“异常断线”,他/她可能会等待很长很长一段时间.. – 2012-04-17 18:47:14
查看MSDN的recv(),尤其是它返回的内容。所有将被揭示!
请注意,'异常断线'<>无断线!如果网络电缆脱离对等体,并且您不尝试发送任何数据(即您正在等待数据),您可以永远等待,正如@Bojan指出的那样 – 2012-04-17 18:45:57
请仔细阅读我的问题;我询问异常断开(或非正常断开连接)。 recv()文件在_graceful_断开期间返回0。 – 2012-04-17 19:22:27
服务器'正在离开'不是从客户端POV异常断开连接。 WSAECONNRESET,WSAETIMEDOUT或WSAECONNABORTED是非正常断开连接,由WSAGetLastError()返回,并且SOCKET_ERROR返回了recv()。半连接没有异常断开。 – 2012-04-17 21:47:56
- 1. 如何检测网络断开连接?
- 2. 检测jsch断开连接
- 3. 如何检测Linux上扭曲的非正常断开连接?
- 4. 无法断开连接并重新连接套接字(C++,winsock2)
- 5. socket.io断开连接事件,客户端断开连接检测
- 6. 如何检测C中的套接字断开连接#
- 7. 如何检测Thrift中的服务器断开连接?
- 8. Xamarin.Android检测摄像头断开连接
- 9. 检测STM32L442 USB断开连接
- 10. 检测断开持久卷曲连接
- 11. 检测eventmachine断开连接并测试重新连接
- 12. 在C#中检测网络状态(连接 - 断开连接)
- 13. 客户端如何正常检测服务器何时断开连接?
- 14. SignalR - 如何检测断开连接的客户端
- 15. 如何检测net.CreateServer内部断开连接的客户端?
- 16. 我们如何检测WCF客户端何时断开连接?
- 17. 如何检测套接字断开?
- 18. 如何异步检查客户端是否断开连接?
- 19. 如何检测win32上的datacard连接和断开连接事件
- 20. C++ winsock2,如何判断连接何时关闭
- 21. 如何在连接后测试TCPClient断开的连接?
- 22. TcpListener:如何检测客户端断开连接?
- 23. 如何检测用户通过PHP断开连接?
- 24. 检测可穿戴式连接/从Android手机断开连接
- 25. 在WCF中检测套接字断开连接
- 26. 在Eclipse中的异常断点 - 如何检查异常对象?
- 27. DB ConnectionState =打开但context.SaveChanges抛出“连接中断”异常
- 28. 在客户端检测SQL Server 2012中的断开连接
- 29. 检测Web服务中的客户端断开连接
- 30. 检测断开连接的Microsoft Access链接表
查看MSDN的recv(),尤其是它返回的内容。所有将被揭示! – 2012-04-17 18:09:27