C# 拔下网络电缆时,插座会发生什么情况?

C# 拔下网络电缆时,插座会发生什么情况?,c#,.net,sockets,C#,.net,Sockets,我有三个应用程序使用套接字相互通信。他们都可以在自己的机器上生活,但也可以共用一台机器。现在我有两个在同一台机器上,第三个在自己的机器上。我试图使我的通信防弹,所以我拔掉电缆,杀死应用程序,以确保一切按预期工作 下面是这件事的简图: 现在,当我拔下PC2的网络电缆(红色连接“Con B”)时,内部连接停止说话(蓝色连接“Con A”)。我从“应用程序1”的套接字发送的内容永远不会到达“应用程序2” 我已经做了一个机制,发现这一点,断开,然后重新连接,然后我可以拔下电缆我想和“cona”只是继

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

下面是这件事的简图:

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

我已经做了一个机制,发现这一点,断开,然后重新连接,然后我可以拔下电缆我想和“cona”只是继续工作。这只是第一次

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

发生了什么事

由答案触发的其他信息: PC 1和PC 2共享到最后一个字节的地址。
我有一个内部保持活动的机制,我每10秒发送一条消息并期望得到响应。

当我关闭应用程序3时,这种情况不会发生,只有在拔下电缆时才会发生。

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

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

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

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


编写客户机/服务器应用程序时,人们常犯的一个错误是没有将应用程序层合并为保持活动或至少在传输层启用保持活动。否则,接收数据的应用程序可能永远不会注意到任何故障情况,直到它写入数据,并且由于传输层超时而导致写入失败。

根据您正在运行的操作系统,拉动网络电缆会产生不同的效果。正如另一张海报所说,Windows检测到它并使任何现有连接失效。在这种情况下,应用程序应该会收到一条连接关闭消息

另一方面,我的Linux服务器非常优雅地处理它。在前几天长时间(30-40秒)断开电缆后,从我的笔记本电脑到服务器的SSH连接仍然很好地可用且响应迅速

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


@爱因斯坦:如果你使用select()或导数,那么永远不要选择空超时值是值得的。始终有一个合理的超时,并在套接字状态过期时检查它。

不幸的是,如果您只是在等待数据,这并不能避免您永远不会收到通知。如果没有keepalive,可能就不会有关于死掉对等机的OOB通知-套接字状态不能用于检测故障条件,而必须先发送()或发送一些内容。这就是为什么keepalives如此重要的原因。