当前位置:  开发笔记 > 运维 > 正文

Linux和IGMPv3上的组播加入

如何解决《Linux和IGMPv3上的组播加入》经验,为你挑选了1个好方法。

我们遇到了一个棘手的问题.我们正在编写一个接收多播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的额外内容?



1> Andrew Edgec..:

要注意的事情.

第一个是(据我所知)将设置/proc/sys/net/ipv4/conf/eth1.22/force_igmp_version为0并不意味着"使用v3",但实际上将其设置为"auto".我相信你可以将它设置为3以强制它使用igmp v3.

但是,要注意的另一件事是igmp堆栈的行为是由它发现的环境决定的.如果你的linux盒子从上游igmp路由器接收igmp v2成员资格查询,那么我相信默认linux行为(由igmp v3 rfc强制要求)仅使用igmp v2进行报告.

据我所知,当你设置/proc/sys/net/ipv4/conf/eth1.22/force_igmp_version为0时,它会使用这种行为.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有