3

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

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

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

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

4

2 回答 2

6

如果您没有显式绑定到接口,我相信 Linux 使用该接口作为默认单播路由进行多播发送。

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

于 2010-02-06T04:44:41.733 回答
4

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

Richard Stevens 的“Unix Network Programming, Vol. 1”第 17 章(至少在第 3 版中)有一些很好的信息和如何枚举网络接口的示例。

于 2009-10-01T13:44:43.023 回答