我们遇到了一个棘手的问题.我们正在编写一个接收多播UDP流量的c程序.我们正在将应用程序迁移到不同的网络环境,我们的运营团队已要求我们支持从我们的应用程序发布IGMPv3成员资格公告.初步调查表明,
Linux 2.6内核确实支持IGMPv3.因此,我很困惑,当我们运行tcpdump时,我们看到以下输出跟踪:
[rtv@myhost]$sudo /usr/sbin/tcpdump -i eth1.22 igmp
tcpdump: listening on eth1.22
00:20:09.007094 switch-a.stage > ALL-SYSTEMS.MCAST.NET: igmp query v2 [max resp time 20] [ttl 1]
00:20:09.241946 10.129.22.236 > 232.0.1.10: igmp v2 report 232.0.1.10 (DF) [tos 0xc0] [ttl 1]
00:20:10.472159 10.129.22.236 > 236.0.1.101: igmp v2 report 236.0.1.101 (DF) [tos 0xc0] [ttl 1]
44 packets received by filter
我的理解是,可以通过在文件/proc/sys/net/ipv4/conf/eth1.22/force_igmp_version中指定非零值来强制内核使用较低版本的IGMP;但是,我已经确认该文件具有零值配置.
我们的应用程序使用以下代码加入多播组:
... joinMulticast(in_addr mcast_addr, in_addr interface_addr)
{
struct ip_mreq mcast_req;
mcast_req.imr_multiaddr.s_addr = mcast_addr;
mcast_req.imr_interface.s_addr = interface_addr;
int err = setsockopt(fFileDesc, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(char*)&theMulti, sizeof(theMulti));
// handle errors etc.
// ...
}
是否还需要在源程序中包含一些强制IGMPv3的额外内容?