我正在使用运行Debian 4的大约40个节点的集群.每个节点都运行一个守护程序,该守护程序位于并侦听多播IP.
我写了一些客户端软件,通过局域网发送多播,客户端计算机与集群在同一台交换机上,这样集群中的每个节点都会收到数据包并做出响应.
它运行良好,除非我在具有LAN和WAN接口的计算机上运行客户端软件.如果存在WAN接口,则多播不起作用.显然,我认为组播错误地通过WAN接口(eth0),而不是LAN(eth1.)所以,我使用SO_BINDTODEVICE套接字选项强制组播套接字使用eth1,一切都很好.
但我认为内核的路由表应该确定LAN(eth1)显然是组播的低成本目的地.有什么理由我必须明确强制套接字使用eth1吗?并且,是否有某种方式(可能是ioctl调用)我可以让应用程序自动确定特定接口是LAN还是WAN?
如果您没有明确绑定到接口,我相信Linux使用接口作为多播发送的默认单播路由.
Linux需要多播路由,如果不存在,则会出现EHOSTUNREACH或ENETUNREACH错误.该LCM项目文档这个问题:如果使用套接字选项IP_MULTICAST_IF或IPV6_MULTICAST_IF,则将覆盖路由.您应该能够通过IPv6地址中的scope-id字段指定接口,但并非所有平台都能正确支持它.正如dameiss所指出的,Stevens的Unix网络编程书涵盖了这些细节,您可以免费浏览通过Google Books进行多播的大部分章节.