8

IPV6 を使用して IPV4 ブロードキャストに相当する方法を見つけようとしています。

ノンブロッキング IPV6 UDP ソケットを作成しています。

ブロードキャスト側から、私は文字通り、ポート 12346 で "FF02::1" に sendto を実行しています。

リッスン側では、グループに参加する必要があることを発見したので、次のことを行いました。

    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」が表示されます。

4

2 に答える 2

4

アドレスはインターフェイスにのみ固有であるため、ローカル スコープの IPv6 用にインターフェイスを設定する必要があります。簡単に言えば、アドレス fe80::1 は eth0 と eth1 の両方に属することができますが、完全に分離されています。

したがって、これは、マルチキャストをサポートするすべてのアップインターフェイスで明示的にマルチキャスト パケットを送信するか、特定のインターフェイスを指定する手段をユーザーに提供する必要があることを意味します。

(編集) ここでマルチキャストコードをチェックアウトできるなら、

http://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/

于 2010-06-26T04:10:46.860 に答える
1

I think the problem is that you are leaving the ipv6mr_interface value at zero, which isn't good enough if you want to use a link-scope multicast address like ff02::1. You need to set the ipv6mr_interface value to the number corresponding with the local network interface you want the packets to be sent/received on. (You can find out what interface indices are available on the current computer by calling getaddrinfo() and reading the sin6_addr.s6_addr values out of the (struct sockaddr_in6 *)'s that it hands to you)

(If at this point you are thinking to yourself, wouldn't it be so much easier if interface zero acted as an "all interfaces" setting... yes, it would be. Alas, IPv6 doesn't do that for some reason :( )

于 2010-06-21T20:53:24.610 に答える