如何检查连接是否丢失

时间:2013-03-07 13:30:02

标签: c++ sockets winapi tcp winsock2

如何检查我与服务器的连接是否丢失? (无论客户端还是服务器端) 我正在使用TCP连接,服务器recv unlimit客户端。为每个客户端服务器创建线程。通过这种方式,我可以为每个客户收回/发送。

4 个答案:

答案 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_ERRORWSAGetLastError()会返回WSAENOTCONN或其他相关错误。

如果您正在读取数据并且recv()返回零,则对等体已执行有序关闭。

如果您正在阅读未连接的套接字,则recv()会返回SOCKET_ERRORWSAGetLastError()会返回WSAENOTCONN或其他相关错误。

MSDN上记录了

WinSock error codes

答案 3 :(得分:0)

始终保持异步或同步接收呼叫未完成(许多应用程序无论如何都要按设计执行此操作) - 在连接丢失时,这将根据您的特定接收API完成失败条件。