getaddrinfo с параметром fist NULL выдает первый IPv4 вместо IPv6 - PullRequest
0 голосов
/ 30 апреля 2019

Я столкнулся с той же проблемой, что и этот OP: getaddrinfo сортирует IPv4 перед IPv6 для локального хоста?

Хотя не было понятных ответов, почему getaddrinfo(NULL, ...) с флагом AI_PASSIVE возвращает сначала IPv4, а затем IPv6?

1 Ответ

1 голос
/ 30 апреля 2019

Я столкнулся с той же проблемой, что и этот OP

Какая проблема? Поведение, которое вы и другой OP описываете, соответствует поведению, задокументированному для getaddrinfo(). Если вам нужны только адреса IPv6, вы можете указать это в структуре подсказок, передаваемых этой функции. Если вы хотите использовать адреса как IPv4, так и IPv6, вы не можете безопасно делать предположения об относительном порядке, в котором они будут возвращены. Тогда у вас есть как минимум две разумные альтернативы, если вы предпочитаете (скажем) IPv6, но готовы вернуться к IPv4:

  1. Сделать запрос (только) адресов IPv6. Если это не дает никакого пригодного для использования адреса, тогда сделайте отдельный запрос для адресов IPv4.
  2. Сделайте запрос без указания семейства адресов и просто будьте готовы сканировать прошлые адреса IPv4 в возвращенном списке в поисках приемлемого адреса IPv6.

В любом случае, правильное использование getaddrinfo() всегда требует, чтобы вы проверяли каждый возвращенный адрес, чтобы определить, соответствует ли он вашим требованиям, пока вы не найдете тот, который соответствует, или вы исчерпали список.

Не существует конкретного «почему» для порядка адресов, кроме простого того, как разработчики вашей библиотеки C решили что-то сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...