Локальная групповая адресация канала IPV6 - PullRequest
7 голосов
/ 18 июня 2010

Я пытаюсь выяснить, как сделать эквивалент трансляции IPV4 с использованием IPV6.

Я создаю неблокирующий сокет IPV6 UDP.

Со стороны вещания я буквально просто отправляю "FF02 :: 1" на порт 12346.

Со стороны прослушивания я обнаружил, что мне нужно присоединиться к группе, поэтому я сделал следующее:

    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".

Ответы [ 2 ]

4 голосов
/ 26 июня 2010

Интерфейс должен быть настроен для локального IPv6, поскольку адреса являются уникальными только для интерфейса.Проще говоря, адрес fe80 :: 1 может принадлежать как к eth0, так и к eth1, но они полностью разделены.

Таким образом, это означает, что вам необходимо явно отправлять многоадресный пакет на каждый интерфейс up , который поддерживаетмногоадресная передача или предоставить пользователю средство указания конкретного интерфейса.

(редактировать) Если это поможет, вы можете проверить код многоадресной рассылки здесь,

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

1 голос
/ 22 июня 2010

Я думаю, что проблема в том, что вы оставляете значение ipv6mr_interface на нуле, что недостаточно, если вы хотите использовать многоадресный адрес области ссылок, такой как ff02 :: 1. Вам необходимо установить в качестве значения ipv6mr_interface число, соответствующее интерфейсу локальной сети, на который вы хотите отправлять / получать пакеты. (Вы можете узнать, какие индексы интерфейса доступны на текущем компьютере, вызвав getaddrinfo () и считав значения sin6_addr.s6_addr из (struct sockaddr_in6 *), которые он вам передает)

(Если в этот момент вы думаете сами, разве не было бы намного проще, если бы нулевой интерфейс действовал как параметр «все интерфейсы» ... да, это было бы. Увы, IPv6 не делает этого по какой-то причине :()

...