3

我正在开发一个 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 再次可用的通知时尝试重新绑定。其他多播应用程序如何处理这种情况?

谢谢,

汤姆

4

2 回答 2

3

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

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

于 2009-11-09T22:05:16.647 回答
0

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

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

于 2009-09-29T07:30:46.420 回答