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