【问题标题】:Selecting an Interface when Multicasting on Linux在 Linux 上进行多播时选择接口
【发布时间】:2010-02-06 12:44:41
【问题描述】:

我正在使用一个由大约 40 个节点组成的集群运行 Debian 4。每个节点都运行一个守护程序,该守护程序位于并侦听多播 IP。

我编写了一些客户端软件,通过 LAN 发送多播,客户端计算机与集群位于同一交换机上,这样集群中的每个节点都会收到数据包并做出响应。

效果很好,除非我在具有 LAN 和 WAN 接口的计算机上运行客户端软件。如果有 WAN 接口,则多播不起作用。所以很明显,我认为多播错误地通过 WAN 接口 (eth0),而不是 LAN (eth1)。所以,我使用 SO_BINDTODEVICE 套接字选项强制多播套接字使用 eth1,一切都很好。

但我认为内核的路由表应该确定 LAN (eth1) 显然是多播的成本较低的目的地。是否有某些原因我必须明确强制套接字使用 eth1?而且,是否有某种方式(可能是 ioctl 调用)可以让应用程序自动确定特定接口是 LAN 还是 WAN?

【问题讨论】:

  • 不,内核和套接字 API 不会自动为您处理这个问题。如果您可以发布一些有助于人们以不同方式编程套接字的代码。基本上,一种方法是检查每个接口并确定它是否使用不可 Internet 路由的 IP 地址。或者,您可以通过所有接口发送。

标签: multicast


【解决方案1】:

如果您没有明确绑定到 界面,我相信Linux使用 默认单播接口 组播发送路由。

Linux 需要多播路由,如果不存在,您将收到 EHOSTUNREACH 或 ENETUNREACH 错误。 LCM project 记录了这个可能的问题。如果您使用套接字选项 IP_MULTICAST_IF 或 IPV6_MULTICAST_IF,路由将被覆盖。您应该能够通过 IPv6 地址中的scope-id field 指定接口,但并非所有平台都正确支持它。正如 dameiss 指出的那样,Stevens 的 Unix Network Programming 书籍涵盖了这些细节,您可以通过 Google Books 免费浏览大部分关于多播的章节。

【讨论】:

    【解决方案2】:

    如果您没有显式绑定到接口,我相信 Linux 使用该接口作为默认单播路由进行多播发送。所以我的猜测是您的默认路由是通过 WAN 接口。

    Richard Stevens 的“Unix 网络编程,第 1 卷”第 17 章(至少在第 3 版中)提供了一些关于如何枚举网络接口的很好的信息和示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-02
      • 2011-04-21
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 2018-09-05
      • 2011-04-17
      • 2011-02-14
      相关资源
      最近更新 更多