Некоторым это покажется странным вопросом. но я искал и не нашел ответа.
Когда я хочу сервер с двумя стеками, мне нужно слушать INADDR_ANY
для IPv4 и до in6addr_any
для IPv6.
Если у меня более одной сетевой карты, мне нужно выбрать, хочу ли я слушать всех или указать, какую карту слушать.
Для этого точного предложения я использую getaddrinfo
метод с настраиваемым именем_хоста. Если host_name
не настроил, то звоню getaddrinfo
с NULL и получите два «ЛЮБЫХ» адреса. Если я настроил его с IP (v6 или v4), я получу только один адрес, что тоже хорошо.
Но когда я использую мой hostname
как настроенное имя_хоста, на машине с Windows я получаю от getaddrinfo
3 адреса: один адрес IPv4 и два адреса IPv6. Первый виден ipconfig как «Link-local IPv6 Address», второй — «IPv6 Address» в разделе «Туннельный адаптер 6TO4 Adapter:».
Адреса упорядочены так:
Итак, если я слушаю все адреса, двойной стек фактически является тройным стеком. Если я беру первый адрес IPv6 (как это было принято на сервере IPv4 с настроенным именем_хоста), я слушаю только «Link-local IPv6 Address», который менее доступен, чем «IPv6 Address», и многие клиенты могут т подключиться к нему, в то время как они могут подключиться к IPv4-адресу.
Сейчас я пытаюсь усложнить это дальше. Я подключил свой мобильный телефон к USB и активировал USB Tethering. когда я разрешаю адреса getaddrinfo
Я получаю 5 адресов:
по этому заказу:
Итак, мои вопросы:
Если бы это был только IPv4, я бы сказал, что я беру только первый IPv4. и не заботится об остальном. но при использовании IPv6, похоже, что последний IPv6 является наиболее подходящим. есть ли соглашение для этого?
Если у меня есть многосетевой компьютер, мне нужно выбрать первую сеть и прослушивать как IPv4, так и IPv6, но здесь результаты смешаны. опять же, есть ли соглашение?
Нужно ли прослушивать все адреса IPv6? в этом случае я буду слушать адрес IPv6, который я не слушаю соответствующий IPv4. и я надеюсь избежать этого.
Спасибо за любую помощь или комментарий.
Но, пожалуйста, не советуйте слушать только «ЛЮБОЙ», так как я не могу.
Локальные адреса связи действительны только в пределах сегмента сети и часто только для вашей машины к машине на другом конце линии связи. Например, ваш локальный USB-адрес будет работать только для связи между телефоном и компьютером, но не более того; ваш локальный IPv6-адрес канала будет использоваться со всех машин на одном концентраторе / коммутаторе, но не за маршрутизатором (что-то похожее на частный адрес IPv4). Если это не ваш ожидаемый вариант использования, я предлагаю вам просто игнорировать локальные адреса ссылок.
Автоматически назначенные локальные адреса создаются с очень специфическим шаблоном и маской, поэтому вы можете определять их программно. Локальные IPv6-адреса каналов находятся в диапазоне fe80 :: / 64 (это означает, что первые байты адреса fe80:0000:0000:0000
и 8 оставшихся байтов могут быть любыми), а локальные IPv4-адреса в диапазоне от 169.254.1.0 до 169.254.255.255.
Также обратите внимание, что все хосты настраивают все Интерфейсы с поддержкой IPv6 с локальным адресом, и сохранит его, даже если ему назначен другой адрес, поэтому от него никуда не деться.
Старый пост, я знаю, как ты наконец решил это? Мне действительно интересно знать.
Для этого я бы порекомендовал вариант, которого вы избегаете, привязать к ЛЮБОМУ, подстановочный знак "::"
, bind(.., "::", ..)
и использовать правила брандмауэра или фильтра пакетов, чтобы исключить нежелательные подключения.