【问题标题】:C# UDP multicast sockets - how to handle link failuresC# UDP 多播套接字 - 如何处理链接故障
【发布时间】:2009-09-24 22:37:33
【问题描述】:

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

谢谢,

汤姆

【问题讨论】:

    标签: c# udp multicast


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 好吧,我的应用程序级协议正在发送/使用心跳,但这在我的问题场景中并没有真正帮助。当接收方应用程序没有收到任何心跳时,可能会发生多种情况: - 发送方应用程序可能已经死机 - 多交换网络中的中间交换机可能已经死机 - 交换机过载等导致过多的数据包损失 - 等将在下一条评论中继续......
      • 在这些情况下,接收者都无法控制要采取的操作,因为重新加入多播套接字会导致异常,因为套接字仍然具有有效的绑定,如果上述任何问题都会得到解决,接收者将再次接收数据而无需采取任何行动。但是,当出现物理链接中断等情况时,纠正措施必须有所不同,并且根据我的测试,套接字不会自动重新加入多播组。因此,除非我在这里遗漏了什么,否则心跳并不能真正解决这种情况。
      猜你喜欢
      • 2014-07-12
      • 2013-03-29
      • 2012-09-22
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      相关资源
      最近更新 更多