我正在使用c ++和winsock lib在Windows中开发客户端服务器应用程序它工作正常但是如果它在网络上并且一旦服务器监听启动并且如果我删除网络电缆那么服务器在任何线程中都没有显示任何错误那么服务器socket知道网络电缆已拔掉。 如果有人知道请帮助我。
答案 0 :(得分:5)
虽然应该可以检测到主机上已拔下网络电缆,但如果网络在服务器和客户端之间的其他位置中断,您仍会遇到同样的问题。
解决这个问题的一种常见(如果不是最常见的)方法是拥有一个" keep-alive"邮件正在发送。如果在某些超时内没有收到对该消息的回复,您只需关闭连接并释放与其关联的所有资源。
A" keep-alive"消息就像使用" ping"命令以查看是否可以访问远程计算机。它只是由服务器或客户端发送的消息(发起它的人并不重要),以查看连接的另一端是否存活且是否可以到达。
它可以像发送字符串一样简单"你在吗?"并期待一个包含&#34的回复;是的我是#34;。如果你每分钟发送一次,并且没有得到(例如)一分钟的回复,你可以认为连接已经死亡。另一端收到了#34;你在吗?",知道它会每分钟收到一次消息。如果它没有到达两分钟,则发送者不再可以访问。
如果无法修改协议以添加此类消息,请查看是否可以使用其他消息。
另外,请记住,最好的和某些情况下只知道连接是否有问题的方法是尝试从套接字读取。
答案 1 :(得分:4)
您可以拔下网络电源然后将其重新插入,或者您的Wi-Fi笔记本电脑可能会丢失接收一秒钟,然后重新接听。如果在我们使用的所有程序中将这些可恢复的案件视为错误,那将是令人沮丧的。
上一个问题涉及检测协议连接何时正常丢弃,但如果要检测其他问题(如未插入的网络电缆或崩溃的工作站)会怎样?在这些情况下,故障会阻止通知远程对等方出现问题。我的感觉是,这通常是一个功能,因为破坏的组件可能会在任何人注意之前得到修复,那么为什么要求重新建立连接?
如果您觉得自己有“特殊需求”的情况,那么您可以积极进行超时。但除非有充分的理由,否则我不会这样做。