如何在C中使用igmp v3加入组播组

时间:2013-07-22 22:49:17

标签: c network-programming multicast igmp

为了加入多播组,我习惯于看到这样的代码:

struct ip_mreqn mreq;
mreq.im_address.s_addr = INADDR_ANY
mreq.imr_ifindex = 0;

inet_aton("232.etc..", $mreq.imr_multiaddr);
setsockopt(descriptor, SOL_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

现在我遇到了一个问题,有人告诉我这是一个v2 igmp加入请求,他们需要v3。这是需要在上面的代码中解决的问题,还是在运行代码的主机上的硬件/网络/操作系统问题?如果错误,我可以采取哪些步骤来纠正上述代码?

2 个答案:

答案 0 :(得分:0)

  

现在我遇到了一个问题,有人告诉我这是一个v2 igmp加入请求,他们需要v3。

目前它不是任何类型的有效加入请求,因为它没有指定有效的多播组。 INADDR_ANY不是多播组,它严格来说是绑定地址。多播组从224.0.0.0开始,但请确保选择一个合法用于此用途且可用的组件。

当你获得这个权利时协议是否参与V2或V3不受此代码的影响:它取决于你调用它时UDP协议栈的作用。你对此没有任何控制权。我不明白为什么'某人'会要求 IGMP V3。

答案 1 :(得分:0)

即使已经有一个已接受的答案,我觉得它没有回答原来的问题。

如果您使用的是Linux,则可以通过更改此文件中的值来强制使用IGMP版本:

/proc/sys/net/ipv4/conf/eth1/force_igmp_version

请注意我所拥有的" eth1"您必须使用您感兴趣的接口。值0表示自动,1,2或3强制使用此特定版本的IGMP。

例如,如果你想在eth0上使用IGMPv3,你可以这样做:

echo 3 > /proc/sys/net/ipv4/conf/eth1/force_igmp_version

在Windows上,您可以运行regedit并在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters上创建名为IGMPVersion的新DWORD。设置为2意味着IGMPv1,3意味着IGMPv2,4意味着IGMPv3。

另外,两个系统在auto上运行时,应始终使用可用的最高版本。这意味着通常没有理由强制使用IGMPv3。如果您碰巧与一些不支持v3的旧设备进行交互,您可能需要强制使用v2。

总而言之,你可以使用原始套接字并挂载整个数据包,强制你要发送的IGMP版本加入你的代码(我的意思是不调整系统配置)的唯一方法自己。