c++ - IPV6链路本地多播

标签 c++ ipv6 multicast link-local

我正在尝试弄清楚如何使用 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/

相关文章:

routing - 克隆数据包并将其转发到多个 IP 地址

c++ - 如何解决 Kerberos 中的 "Encryption type not permitted"错误?

c++ - 如何声明函数标识符

c++ - 数学表达式中奇怪的 clang 格式

python - IPRange IPv6 和 cidrs()

sockets - 使用 GNAT.Sockets 接收多播流量

c++ - cin >> 输入字符串时双循环

flask - Flask 应用程序中的双 IPv4 和 IPv6 支持

ios - 仅IPV6问题

multicast - 任何在指定的UDP端口上接收多播数据包的小程序?