我有三个应用程序使用套接字相互通信.他们都可以在自己的机器上生活,但他们也可以共享一台机器.现在我在他们自己的机器上有两个在同一个和第三个.我正在努力使我的通信防弹,所以我拔掉电缆并杀死应用程序,以确保一切按预期工作.
这是一个快速的草图:
现在,当我拔下网线到PC2(红色连接"Con B")时,内部连接停止通话(蓝色连接"Con A").我从"应用程序1"发送的东西在套接字上永远不会到达"App 2".
我已经建立了一个发现这个并断开然后重新连接的机制,之后我可以拔掉所有我想要的电缆,"Con A"就会继续工作.这只是第一次.
我已确认在断开"Con B"之前通过"Con A"进行通信.
我以完全相同的方式连接和重新连接,它是相同的代码,所以没有区别.
发生了什么?
答案触发的附加信息:PC 1和PC 2共享地址直至最后一个字节.
我有一个内部保持活动机制,我发送一条消息,并期望每10秒响应一次.
当我杀死App 3时,只有在拔掉电缆时才会发生这种情况.
你在"Con A"中使用了什么地址?如果您正在使用绑定到外部网络适配器的地址,即使您正在与同一台计算机通信,那么您所描述的内容也可能发生.
你可以做的是使用localhost
"Con A" 的地址(127.0.0.1),它应该完全独立于外部网络上发生的事情.
在某些平台(窗口)上拉动网络电缆会告诉网络堆栈激活无效的与接口相关的开放套接字连接.
在这种情况下,拉网络电缆实际上是一个糟糕的测试,因为它为您的应用程序提供了在实际情况下可能无法接收的正面反馈.
人们在编写客户端/服务器应用程序时要犯的一个常见错误是,不要将应用程序层保持活动状态,或者至少在传输层启用keepalive.否则应用程序recv()数据可能永远无法识别任何失败条件,直到write()s和写入因传输层超时而失败.