如何检查我与服务器的连接是否丢失? (无论客户端还是服务器端) 我正在使用TCP连接,服务器recv unlimit客户端。为每个客户端服务器创建线程。通过这种方式,我可以为每个客户收回/发送。
答案 0 :(得分:2)
您可以考虑使用套接字上的TCP-keepalive option作为一个选项。
但是如果在一段时间内没有观察到任何活动,那么许多NAT和状态防火墙实际上会丢弃TCP连接。并且此活动超时可能比TCP支持的定期keepalive消息更快。因此,每隔30-60秒向服务器发送一条协议消息通常足以使连接与NAT保持“活动”。
我个人的看法是这样的。如果连接要长时间运行,客户端有责任通知服务器“我还在这里”。服务器应该定期唤醒并关闭最后N秒没有任何流量的任何TCP连接。 (其中N是您申请的合理价值)。在您的情况下,“每个客户端的线程”方法意味着每个线程只需要确定远程客户端何时无响应。
在协议中,客户端可以每30-60秒向服务器发送自己的自定义“ping”消息。服务器总是回复此消息并记录客户端仍然存在。
我正在讨论的很多内容实际上取决于您的协议,您的服务所做的以及预期连接的持续时间。
答案 1 :(得分:1)
在您的应用中构建ping system。
答案 2 :(得分:0)
如果套接字不再连接,send()
会返回SOCKET_ERROR
而WSAGetLastError()
会返回WSAENOTCONN
或其他相关错误。
如果您正在读取数据并且recv()
返回零,则对等体已执行有序关闭。
如果您正在阅读未连接的套接字,则recv()
会返回SOCKET_ERROR
,WSAGetLastError()
会返回WSAENOTCONN
或其他相关错误。
答案 3 :(得分:0)
始终保持异步或同步接收呼叫未完成(许多应用程序无论如何都要按设计执行此操作) - 在连接丢失时,这将根据您的特定接收API完成失败条件。