Ссылка IPv6 локальная многоадресная передача

Я пытаюсь выяснить, как сделать эквивалент широковещательной передачи IPv4 с помощью IPv6.

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

От широковещательной передачи стороны я буквально просто делаю sendto "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".

8
задан Goz 18 June 2010 в 08:53
поделиться

2 ответа

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

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

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

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

4
ответ дан 5 December 2019 в 23:13
поделиться

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

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

1
ответ дан 5 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: