Нахождение правильного номера «сетевого интерфейса» для IPv6 - PullRequest
3 голосов
/ 10 мая 2011

Я пытаюсь использовать Boost для связи по IPv6 и многоадресной сети. Мне нужно создать многоадресный сокет IPv6, который использует определенный индекс сетевого интерфейса.

Мне удалось найти правильный параметр многоадресной рассылки для установки индекса сетевого интерфейса в boost / asio / ip / detail / socket_option.hpp: явный запрос многоадресной рассылки (const boost :: asio :: ip :: address_v6 & multicast_address, unsigned long network_interface = 0)

Проблема в том, что я не знаю, как найти правильное значение для параметра "network_interface". Есть ли способ получить значение network_interface, используя локальный адрес IPv6, который я могу предоставить? Я просмотрел документацию и примеры, но ничего не смог найти.

- Дилан

Ответы [ 2 ]

4 голосов
/ 10 мая 2011

Каждая платформа предоставляет API для перечисления сетевых интерфейсов, например, getifaddrs для многих Unix и GetAdaptersAddresses для Windows.Обратите внимание, что в Windows есть отдельное числовое пространство для адаптеров IPv4 и IPv6, что делает вызов API if_nametoindex весьма запутанным.

Вы можете проверить методы, которые я использовал в OpenPGM, на предмет переносимости.учитывая, что в Windows нет действительно полезных имен адаптеров:

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

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

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

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

2 голосов
/ 10 мая 2011

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

В Linux вы можете найтичто вы хотите во втором столбце /proc/net/if_inet6, который также доступен более надежно через интерфейс rtnetlink(7).

...