4

如何检查我与服务器的连接是否丢失?(无论是客户端还是服务器端)我正在使用 TCP 连接,并且服务器接收无限客户端。服务器为每个客户端创建线程。这样我就可以为每个客户接收/发送。

4

4 回答 4

3

您可以考虑在套接字上使用TCP-keepalive 选项作为一种选择。

但是很多 NAT 和全状态防火墙如果在一段时间内没有观察到任何活动,实际上会丢弃 TCP 连接。而且这个活动超时可能比 TCP 支持的周期性 keepalive 消息更快。出于这个原因,每 30-60 秒向您的服务器发送一条协议消息通常足以保持与 NAT 相关的“活动”连接。

我个人的看法是这样的。如果连接需要长时间运行,则客户端有责任通知服务器“我还在这里”。服务器应定期唤醒并关闭在过去 N 秒内没有任何流量的任何 TCP 连接。(其中 N 是您的应用程序的合理值)。在您的情况下,“每个客户端线程”方法意味着每个线程只需要决定远程客户端何时变得无响应。

在协议中,客户端可以每 30-60 秒向服务器发送它自己的自定义“ping”消息。服务器总是回复此消息并记录客户端仍然存在。

我正在讨论的很多内容实际上取决于您的协议、您的服务的功能以及连接预计会持续多长时间。

于 2013-03-08T09:59:18.950 回答
1

在您的应用程序中构建一个ping 系统

于 2013-03-07T13:36:28.623 回答
0

如果套接字不再连接,则send()返回SOCKET_ERRORWSAGetLastError()返回WSAENOTCONN或其他相关错误。

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

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

WinSock 错误代码记录在 MSDN 上。

于 2013-03-07T14:14:40.353 回答
0

始终保持异步或同步接收调用未完成(许多应用程序无论如何都会这样做) - 在连接丢失时,这将根据您的特定接收 API 完成失败条件。

于 2013-03-07T14:15:03.270 回答