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