Локальная групповая адресация канала 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".
2 ответа
Интерфейс должен быть настроен для локального IPv6, поскольку адреса являются уникальными только для интерфейса. Проще говоря, адрес fe80::1 может принадлежать как к eth0, так и к eth1, но они полностью разделены.
Таким образом, это означает, что вам нужно явно отправлять многоадресный пакет на каждый интерфейс up, который поддерживает многоадресную рассылку, или предоставить пользователю средство указания конкретного интерфейса.
(изменить) Если это поможет, вы можете проверить многоадресный код здесь,
http://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/
Я думаю, проблема в том, что вы оставляете значение ipv6mr_interface на нуле, что недостаточно, если вы хотите использовать многоадресный адрес области ссылок, такой как ff02::1. Вам нужно установить значение ipv6mr_interface на номер, соответствующий локальному сетевому интерфейсу, на который вы хотите отправлять / получать пакеты. (Вы можете узнать, какие индексы интерфейса доступны на текущем компьютере, вызвав getaddrinfo() и считав значения sin6_addr.s6_addr из (struct sockaddr_in6 *), которые он вам передает)
(Если в этот момент вы думаете о себе, разве не было бы намного проще, если бы нулевой интерфейс действовал как настройка "всех интерфейсов"... да, это было бы. Увы, IPv6 по какой-то причине не делает этого:()