0

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

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。这是需要在上面的代码中解决的问题,还是运行上述代码的主机上的硬件/网络/操作系统问题?如果上面的代码有误,我可以采取哪些步骤来更正上面的代码?

4

2 回答 2

0

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

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

当你做对时使用的协议是V2还是V3不受这段代码的影响:这取决于你调用它时UDP协议栈做了什么。你对此没有任何控制权。我也不明白为什么“某人”需要IGMP V3。

于 2013-07-23T00:53:48.527 回答
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 上,您可以运行regeditHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters创建一个名为IGMPVersion. 设置为2将意味着 IGMPv1、3IGMPv2 和4IGMPv3。

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

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

于 2017-07-20T12:13:38.167 回答