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

C#UDP多播套接字-如何处理链路故障,c#,udp,multicast,C#,Udp,Multicast,我正在研究一个UDP多播库,遇到了一个关于如何正确处理链路故障、断开/重新连接的NIC电缆等的问题 在我的测试中,我有以下设置: 2台服务器sA和sB sA正在发送UDP多播数据,sB正在接收多播数据 服务器通过第2层Cisco千兆交换机连接 例如,当我加入sB上的多播组时,我开始从sA的多播数据包接收该套接字上的数据 现在,当我禁用/拔下多播接收器sB绑定到的NIC时,我不会 接收任何套接字级别的错误(例如socket.ReceiveAsync中的错误),我猜这是因为UDP是无连接的,但我

我正在研究一个UDP多播库,遇到了一个关于如何正确处理链路故障、断开/重新连接的NIC电缆等的问题

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

  • 2台服务器sA和sB
  • sA正在发送UDP多播数据,sB正在接收多播数据
  • 服务器通过第2层Cisco千兆交换机连接
例如,当我加入sB上的多播组时,我开始从sA的多播数据包接收该套接字上的数据

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

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

谢谢


Tom

我无法详细说明,因为我的公司协议是如何工作的,这是公司的秘密,但在服务器和客户机之间周期性地进行心跳编程。然后,您的软件可以计算最后一次心跳到达的时间,并推断您是否遇到了某种网络/硬件故障


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

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


要解决网络脱机时可用的问题,请设计事件处理程序以优雅地重置接收器。反之,当网络可用性处于联机状态时,请重新绑定接收器。

好吧,我的应用程序级协议是发送/消耗心跳,但这在我的问题场景中并没有真正的帮助。当接收方应用程序未接收到任何心跳信号时,可能会出现多种情况:-发送方应用程序可能只是死机-多交换机网络中的中间交换机可能死机-交换机过载,etc.导致过度数据包丢失-etc.将在下一条评论中继续…在这些情况下,接收者都无法控制要采取的行动,因为重新加入多播套接字将导致异常,因为套接字仍然具有有效绑定,并且如果上述任何问题得到解决,接收器将再次接收数据,而无需采取任何行动。但是,当出现物理链路中断等情况时,纠正措施必须与我的测试不同,并且套接字不会自动重新加入多播组。所以,除非我遗漏了什么,否则心跳并不能真正解决这个问题。