首页 文章

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

提问于
浏览
3

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

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

  • 2台服务器sA和sB

  • sA正在发送UDP组播数据,sB正在接收组播数据

  • 服务器通过第2层思科千兆交换机连接

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

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

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

谢谢,

汤姆

2 回答

  • 0

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

    要解决可用网络脱机的问题,请设计事件处理程序以正常重置接收器 . 然后相反,当网络可用性在线时,重新绑定您的接收器 .

  • 3

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

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

相关问题