我正在研究UDP多播库,并对如何正确处理链路故障,断开/重新连接的NIC电缆等问题提出了疑问。
在我的测试中,我有以下设置:
例如,当我加入sB上的组播组时,我开始从sA的组播数据包接收该套接字上的数据。
现在,当我禁用/拔出组播接收器sB绑定的NIC时,我不是 接收任何套接字级错误(例如在Socket.ReceiveAsync中),我猜这是因为UDP是无连接的,但我希望我会得到某种通知/异常,因为组播接收器绑定的IP变得不可用。 / p>
无论如何,当我重新启用该NIC时,虽然发送方仍然在同一个多播组上发送,但我没有收到任何数据。 我希望内核实际上会在硬件链接出现故障后重新加入多播组,但看起来却没有。但是,由于我没有得到任何套接字级错误,我真的不知道如何检测多播接收器的链路故障? 是否需要设置某些套接字选项,以便内核重新加入多播组? 到目前为止,我想出的唯一选择是侦听System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged事件,并在收到我必须绑定的本地IP再次可用的通知时尝试重新绑定。 其他多播应用程序如何处理该场景?
谢谢,
汤姆
答案 0 :(得分:3)
我建议您订阅以下事件:System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
要解决网络可用离线时的问题,请设计事件处理程序以优雅地重置接收器。然后相反,当网络可用性在线时,重新绑定您的接收器。
答案 1 :(得分:0)
我不能详细说明,因为它是公司秘密我的公司协议如何工作,但在您的服务器和客户之间定期心跳节目。然后,您的软件可以在最后一次心跳到达时在内部计时,并在您遇到某种网络/硬件故障时进行推断。
您可以尝试使用很多选项来尝试检测发生的故障,包括检查NetworkAddressChanged,但实施心跳会更安全,因为它是一个易于实现的通用解决方案,应该涵盖几乎所有情况