C#UDP多播套接字 - 如何处理链路故障

时间:2009-09-24 22:37:34

标签: c# udp multicast

我正在研究UDP多播库,并对如何正确处理链路故障,断开/重新连接的NIC电缆等问题提出了疑问。

在我的测试中,我有以下设置:

  • 2台服务器sA和sB
  • sA正在发送UDP组播数据,而sB正在接收组播数据
  • 服务器通过第2层思科千兆交换机连接

例如,当我加入sB上的组播组时,我开始从sA的组播数据包接收该套接字上的数据。

现在,当我禁用/拔出组播接收器sB绑定的NIC时,我不是 接收任何套接字级错误(例如在Socket.ReceiveAsync中),我猜这是因为UDP是无连接的,但我希望我会得到某种通知/异常,因为组播接收器绑定的IP变得不可用。 / p>

无论如何,当我重新启用该NIC时,虽然发送方仍然在同一个多播组上发送,但我没有收到任何数据。 我希望内核实际上会在硬件链接出现故障后重新加入多播组,但看起来却没有。但是,由于我没有得到任何套接字级错误,我真的不知道如何检测多播接收器的链路故障? 是否需要设置某些套接字选项,以便内核重新加入多播组? 到目前为止,我想出的唯一选择是侦听System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged事件,并在收到我必须绑定的本地IP再次可用的通知时尝试重新绑定。 其他多播应用程序如何处理该场景?

谢谢,

汤姆

2 个答案:

答案 0 :(得分:3)

我建议您订阅以下事件:System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

要解决网络可用离线时的问题,请设计事件处理程序以优雅地重置接收器。然后相反,当网络可用性在线时,重新绑定您的接收器。

答案 1 :(得分:0)

我不能详细说明,因为它是公司秘密我的公司协议如何工作,但在您的服务器和客户之间定期心跳节目。然后,您的软件可以在最后一次心跳到达时在内部计时,并在您遇到某种网络/硬件故障时进行推断。

您可以尝试使用很多选项来尝试检测发生的故障,包括检查NetworkAddressChanged,但实施心跳会更安全,因为它是一个易于实现的通用解决方案,应该涵盖几乎所有情况