【发布时间】:2011-12-14 07:09:57
【问题描述】:
我正在使用 c++ 和 winsock lib 在 Windows 中开发客户端服务器应用程序,它工作正常,但如果它在网络上并且一旦服务器侦听开始并且如果我移除网络电缆,那么服务器在任何线程中都不会显示任何错误所以服务器在哪里插座知道网络电缆已拔下。 如果有人知道,请帮助我。
【问题讨论】:
我正在使用 c++ 和 winsock lib 在 Windows 中开发客户端服务器应用程序,它工作正常,但如果它在网络上并且一旦服务器侦听开始并且如果我移除网络电缆,那么服务器在任何线程中都不会显示任何错误所以服务器在哪里插座知道网络电缆已拔下。 如果有人知道,请帮助我。
【问题讨论】:
虽然应该可以检测到主机上的网络电缆已拔下,但如果您的服务器和客户端之间的其他地方网络中断,您仍然会遇到同样的问题。
解决此问题的一种常见(如果不是最常见的)方法是发送“保持活动状态”消息。如果在某个超时时间内没有收到对该消息的回复,您只需关闭连接并释放与其关联的所有资源。
“keep-alive”消息就像使用“ping”命令查看是否可以访问远程计算机。它只是由服务器或客户端发送的一条消息(无论是谁发起它),以查看连接的另一端是否处于活动状态并且可以到达。
它可以像发送字符串“你在吗?”一样简单。并期待包含“是的,我是”的回复。如果您每分钟发送一次,并且在一分钟内(例如)没有得到回复,您可以认为连接已死。接收“你在吗?”的另一端知道它将每分钟收到一次消息。如果两分钟仍未到达,则无法再访问发件人。
如果无法修改协议以添加此类消息,则查看是否可以使用其他消息代替。
另外,请记住,了解连接是否有问题的最佳且在某些情况下唯一的方法是尝试从套接字读取。
【讨论】:
您可以拔下网络,然后重新插入,否则您的 Wi-Fi 笔记本电脑可能会暂时无法接收信号,然后再将其恢复。如果我们使用的所有程序都将此类可恢复的案例视为错误,那将是令人沮丧的。
上一个问题涉及检测协议连接何时正常断开,但如果您想检测其他问题,例如网线未插入或工作站崩溃,该怎么办?在这些情况下,故障会阻止通知远程对等方出现问题。我的感觉是,这通常是一个功能,因为损坏的组件可能会在任何人注意到之前得到修复,所以为什么要求重新建立连接?
如果您觉得自己有“特殊需求”情况,您可以积极处理超时。但除非有非常好的理由,否则我不会这样做。
【讨论】: