拔下网线时插座会发生什么变化?

问题描述 投票:7回答:3

我有三个应用程序使用套接字相互通信。他们都可以在自己的机器上生活,但他们也可以共享一台机器。现在我在他们自己的机器上有两个在同一个和第三个。我正在努力使我的通信防弹,所以我拔掉电缆并杀死应用程序,以确保一切按预期工作。

这是一个快速的草图:

alt text

现在,当我拔下网线到PC2(红色连接“Con B”)时,内部连接停止通话(蓝色连接“Con A”)。我从“应用程序1”发送的东西在套接字上永远不会到达“App 2”。

我已经建立了一个发现这个并断开然后重新连接的机制,之后我可以拔掉所有我想要的电缆,“Con A”只是继续工作。这只是第一次。

我已确认在断开“Con B”之前通过“Con A”进行通信。 我以完全相同的方式连接和重新连接,它是相同的代码,所以没有区别。

发生了什么?

答案触发的附加信息:PC 1和PC 2共享地址直至最后一个字节。 我有一个内部保持活动机制,我发送一条消息,并期望每10秒响​​应一次。 当我杀死App 3时,只有在拔掉电缆时才会发生这种情况。

c# .net sockets
3个回答
5
投票

你在“Con A”中使用了什么地址?如果您正在使用绑定到外部网络适配器的地址,即使您正在与同一台计算机通信,那么您所描述的内容也可能发生。

你可以做的是使用地址localhost(127.0.0.1)作为“Con A”,它应该完全独立于外部网络上发生的事情。


5
投票

在某些平台(窗口)上拉动网络电缆会告诉网络堆栈主动使与该接口关联的打开套接字连接无效。

在这种情况下,拉网络电缆实际上是一个糟糕的测试,因为它为您的应用程序提供了在实际情况下可能无法接收的正面反馈。

人们在编写客户端/服务器应用程序时要犯的一个常见错误是,不要将应用程序层保持活动状态,或者至少在传输层启用keepalive。否则应用程序recv()数据可能永远无法识别任何失败条件,直到write()s和写入因传输层超时而失败。


2
投票

根据您运行的操作系统,拉网线有不同的效果。正如另一张海报所说,Windows检测到它并使任何现有连接无效。在这种情况下,您的应用程序应该获得连接关闭消息。

另一方面,我的Linux服务器非常优雅地处理它。在前一天延长(30-40秒)解除布线后,从我的笔记本电脑到服务器的SSH连接仍然可以快速地提供并且响应迅速。

只要电缆没有拔出超过TCP超时的时间,堆栈就应该能够缓冲数据包并尽快重新传输。 TCP就是为此而设计的。如果您不使用TCP,则数据包将从以太网孔中掉出并蒸发到大气中。

@einstein:如果你正在使用select()或派生词,那么永远不会选择NULL超时。始终有合理的超时并检查套接字状态是否过期。

© www.soinside.com 2019 - 2024. All rights reserved.