如何检查连接是不是丢失
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_ERROR
和WSAGetLastError()
返回WSAENOTCONN
或其他相关错误。
如果您正在读取数据并且recv()
返回零,则对等方已执行有序关闭。
如果您正在从未连接的套接字读取,则recv()
返回SOCKET_ERROR
和WSAGetLastError()
返回WSAENOTCONN
或其他相关错误。
WinSock error codes 记录在 MSDN 上。
【讨论】:
“未连接的套接字”和连接断开的套接字之间存在区别,它只是一个尚未调用 connect() 的套接字,会导致 ENOTCONN读取时为 EOS,读取或写入时为 ECONNRESET 或类似。 @EJP - “我如何检查我与服务器的连接是否丢失”,我假设连接已建立。因此我不明白我的答案有什么问题 您的回答有问题的是ENOTCONN
仅在未建立连接的情况下(1)返回,而在连接已建立的情况下(2)永远不会返回。我不知道你想让我说多少种不同的方式。
先生。 @EJP:“我不知道你想让我说多少种不同的方式”
以上是关于如何检查连接是不是丢失的主要内容,如果未能解决你的问题,请参考以下文章