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

3
我正在开发一个UDP组播库,对于如何正确处理链路故障、断开/重新连接的网卡电缆等问题,我有一个疑问。
在我的测试中,我有以下设置: - 2个服务器sA和sB - sA发送UDP组播数据,sB接收组播数据 - 服务器通过一台二层Cisco千兆交换机连接
例如,当我在sB上加入多播组时,我从sA的多播包中开始在该套接字上接收数据。
现在,当我禁用/拔出多播接收器sB绑定的网卡时,在套接字级别上不会收到任何错误(例如在Socket.ReceiveAsync中),我想这是可以预期的,因为UDP是无连接的,但我希望会得到某种通知/异常,因为多播接收器绑定的IP变得不可用。
无论如何,当我重新启用那张网卡时,我再也没有收到数据,尽管发送者仍在同一多播组上发送。 我原本以为内核会在硬件链路失败后处理重新加入多播组,但看起来并不是这样。然而,由于我也没有收到任何套接字级别的错误,所以我不知道如何检测多播接收器的链接失败? 是否需要设置某些套接字选项才能使内核重新加入多播组? 到目前为止,我想到的唯一选项是监听System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged事件,并在收到通知后尝试重新绑定,当我再次获得要绑定到的本地IP地址时。 其他多播应用程序如何处理这种情况?
谢谢, Tom
2个回答

3
我建议您订阅以下事件:System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged。
为了解决网络不可用的问题,设计您的事件处理程序以优雅地重置接收器。然后相反地,当网络可用性在线时,请重新绑定您的接收器。

0

我不能详细说明公司协议的工作原理,因为这是公司的机密,但是在你的服务器和客户端之间定期进行程序交流。然后,你的软件可以内部计时最后一次心跳到达的时间,并推断是否遭受了某种网络/硬件故障。

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


好的,我的应用层协议正在发送/消耗心跳包,但这并不能真正帮助解决我的问题。当接收方应用程序没有接收到任何心跳包时,可能发生多种情况:
  • 发送方应用程序可能已经死亡
  • 多交换网络中的中间交换机可能已经死亡
  • 交换机过载等原因导致丢包过多
  • 等等。
待续...
- TJF
在这些情况下,接收器都无法控制要采取什么行动,因为重新加入多播套接字会导致异常,因为套接字仍具有有效绑定,如果上述任何问题得到解决,则接收器将再次接收数据而无需采取任何行动。然而,当存在物理链接中断等情况时,纠正措施必须不同,并且从我的测试中可以看出,套接字不会自动重新加入多播组。因此,除非我在这里漏掉了什么,否则心跳并不能解决这种情况。 - TJF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接