2013-07-24 2 views
5

Я хочу определить, является ли адрес временным адресом ipv6, я использую getifaddrs для получения списка адресов, но не знаю, как получить эту информацию оттуда. И если это возможно, я хочу, чтобы это работало для linux, osx, solaris и windows.определить временный адрес ipv6 crossplatform

Похоже, что в Linux IFA_F_TEMPORARY установлен в inet6_ifaddr-> ifa_flags, но не уверен, как мне это получить из ifaddrs, возвращаемого getifaddrs.

Кажется, что OSX мне нужен octl с SIOCSIFINFO_FLAGS, и я понятия не имею о Solaris или Windows.

имеет любое тело пример кода, который мог бы это сделать.

+0

Вы когда-нибудь находили ответ на этот вопрос, Хосе? Мне любопытно, я ... – theory

+0

Нет, это было немного сложно и решило не реализовывать его. –

+0

Bummer. У вас есть хотя бы код, показывающий, как использовать 'octl' на OS X, который делает трюк? – theory

ответ

2

Обновлено (3 августа 2016): После поиска и выключаться в течение последних нескольких месяцев по этому вопросу (потому что я на самом деле в этом нуждаются ответить себе). Я считаю, что нашел Windows-ориентированный ответ. Я тестировал это только на Windows 10, поэтому я не знаю о более старых версиях. Но этот API не должен измениться, если кто-то хочет, чтобы проверить это для меня :-)

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

Что такое временный адрес IPv6 .... это адрес с RANDOM SUFFIX! Итак, для всех адресов IPv6 в IP_ADAPTER_UNICAST_ADDRESS посмотрите на IP_SUFFIX_ORIGIN, если это IpSuffixOriginRandom. Это оно.

Я действительно все еще шокирован тем, как мало в этой теме в Интернете, и это будет огромной проблемой в течение нескольких лет для разработчиков сетевых приложений, если никто не знает, как решить эту проблему для серверных приложений (даже те, работает на потребительских ПК)

Вы впервые услышали ответ!


(Оригинал ответа): Я смотрел на эту тему точной для кросс-платформенных приложений, а также. Я думаю, что нашел «способ» отфильтровать временные адреса IPv6 в Windows. В основном RFC 4941 претензий временные адреса должны:

  1. иметь действительный Lifetime меньше, чем адрес "Public"
  2. имеют преимущественное Lifetime меньше, чем адрес "Public"

Так что для C++, когда используя функцию GetAdaptersAddresses, вы можете посмотреть в структуре PIP_ADAPTER_ADDRESSES для структуры _IP_ADAPTER_UNICAST_ADDRESS и оценить члены ValidLifetime и PreferredLifetime. После фильтрации для типа адреса (если вам нужно знать Local-Link vs Public), вы можете сохранить текущую таблицу наибольшего времени жизни. Наибольший срок службы (за адаптер) должен быть общедоступным!

Чтобы увидеть информационное время жизни адреса быстро запустить команду Windows Terminal: Netsh интерфейс ipv6 показать адрес

Вы можете увидеть все временные адреса намного меньше, чем невыполненная SLAAC жизнь.

Я сейчас работаю с этим допущением, пока тестирование не докажет обратное. Все временные адреса основаны на публике и поэтому не могут жить в нем.

Надеюсь, что это поможет

+0

Это не работает на моей машине. Как мой временный, так и обычный IP-адрес отображаются с одинаковой продолжительностью жизни: Addr Тип DAD State Valid Life Pref. Life Адрес ---------- ----------- ---------- ---------- ------- ----------------- Публичный Предпочитаемый 1h58m15s 16m36s xxxx: xx: xxxx: 2000: 71e7: xxxx: xxxx: f4 5b Временный Предпочтительный 1h58m15s 16m36s xxxx: xx: xxxx: 2000: 8479: xxxx: xxxx: a7 0a Другое Предпочитаемый бесконечный бесконечный fe80 :: 71e7: xxxx: xxxx: f45b% 19 – Philipp

+0

Ну, моя единственная мысль - это то, что вы описали, будет идти против RFC 4941 Раздел 3.3.4 и isn что-то, что я смог воспроизвести при тестировании (используя IPv6 DHCP из Verizon и Comcast) под Windows 8.1 и Windows 10. Поэтому я не могу говорить о том, что вы опубликовали. Если это действительно так, то есть случаи кросс, которые не подходят правильно. Надеюсь, кто-то найдет лучший способ. – Josh

Смежные вопросы