如何检查连接是不是丢失

Posted

技术标签:

【中文标题】如何检查连接是不是丢失【英文标题】:How to check if connection lost如何检查连接是否丢失 【发布时间】:2013-03-07 13:30:01 【问题描述】:

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

【问题讨论】:

解释一下“迷失”是什么意思?任何一方都关闭连接,或者您是否要设置某种响应计时器,之后您认为连接“丢失”? 然后连接丢失,我想重新连接。这样做,直到我会连接。当我连接并且连接再次丢失时。重试连接。 【参考方案1】:

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

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

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

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

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

【讨论】:

确定 TCP 连接是否仍处于活动状态不是程序员的责任。让它活着是。为这篇文章 +1。【参考方案2】:

在您的应用程序中构建一个ping system。

【讨论】:

我如何使用 winsock ;D 做到这一点? 我认为这对于大多数用例来说工作量太大,但是如果例如,可能需要心跳或其他 ping 协议。服务器可能会变得无响应而没有实际的连接丢失。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

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

WinSock error codes 记录在 MSDN 上。

【讨论】:

“未连接的套接字”和连接断开的套接字之间存在区别,它只是一个尚未调用 connect() 的套接字,会导致 ENOTCONN读取时为 EOS,读取或写入时为 ECONNRESET 或类似。 @EJP - “我如何检查我与服务器的连接是否丢失”,我假设连接已建立。因此我不明白我的答案有什么问题 您的回答有问题的是 ENOTCONN 仅在未建立连接的情况下(1)返回,而在连接已建立的情况下(2)永远不会返回。我不知道你想让我说多少种不同的方式。 先生。 @EJP:“我不知道你想让我说多少种不同的方式”

以上是关于如何检查连接是不是丢失的主要内容,如果未能解决你的问题,请参考以下文章

Delphi + Synapse:如何检查我是不是仍然连接

检查点 *** 问题:与 *** 服务的连接丢失 [关闭]

mysql.sock丢失后如何连接数据库

错误代码:2013。查询期间丢失与 MySQL 服务器的连接

连接丢失时未检测到 QNetworkReply 错误信号

无法确定当前国家代码:错误域=NSURLErrorDomain 代码=-1005 “网络连接丢失。”