为了加入多播组,我习惯于看到这样的代码:
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。这是需要在上面的代码中解决的问题,还是在运行代码的主机上的硬件/网络/操作系统问题?如果错误,我可以采取哪些步骤来纠正上述代码?
答案 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版本加入你的代码(我的意思是不调整系统配置)的唯一方法自己。