我正在尝试弄清楚如何使用 IPV6 进行相当于 IPV4 广播的操作。
我正在创建一个非阻塞 IPV6 UDP 套接字。
从侧面广播来看,我实际上只是在端口 12346 上发送“FF02::1”。
在收听方面,我发现我需要加入群组,所以我执行了以下操作:
ipv6_mreq membership;
memset( &membership.ipv6mr_multiaddr, 0, sizeof( in6_addr ) );
membership.ipv6mr_multiaddr.u.Word[0] = htons( 0xff02 );
membership.ipv6mr_multiaddr.u.Word[7] = htons( 0x0001 );
membership.ipv6mr_interface = 0;
if( enable )
{
if ( 0 != setsockopt( m_Socket, SOL_SOCKET, IPV6_JOIN_GROUP, (char*)&membership, sizeof( ipv6_mreq ) ) )
{
DisplayError();
return false;
}
}
但是 setsockopt 总是返回“WSAENOPROTOOPT”。为什么?谁能帮我解决这个问题?我完全不知所措。
编辑:我将级别更改为“IPPROTO_IPV6”,但现在我得到的是“WSAEINVAL”。
最佳答案
必须为本地范围的 IPv6 设置接口(interface),因为地址仅对接口(interface)唯一。简单来说,地址 fe80::1 可以同时属于 eth0 和 eth1,但它们是完全独立的。
因此这意味着您需要在支持多播的每个up 接口(interface)上显式发送多播数据包,或者为用户提供指定特定接口(interface)的方法。
(编辑)如果有帮助,您可以在此处查看多播代码,
http://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/
关于c++ - IPV6链路本地多播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3068231/