Нужно ли перебирать getaddrinfo ()? - PullRequest
0 голосов
/ 13 мая 2019

Для этого есть похожие вопросы , но я не могу найти ответ, который ищу.

#include <netdb.h>

int getaddrinfo (const char *hostname, 
                 const char *service, 
                 const struct addrinfo *hints, 
                 struct addrinfo **result) ;

Returns: 0 if OK, nonzero on error 

Что мне интересно, так это то, почему нам нужна итерация по связанному списку, на который указывает result, даже если мы определяем hints вместо того, чтобы быть NULL. Мы уже знаем IP (имя хоста) и PORT (сервис). Не так ли?

Если итерация необходима, могли бы вы привести пример, просто рассмотрев парня, не обладающего полным знанием сети?

Например, я определяю hints следующим образом.

struct addrinfo  hints;

        memset(&hints, 0, sizeof hints);
        hints.ai_family = AF_UNSPEC;        /* IPv4 or IPv6 */
        hints.ai_socktype = SOCK_STREAM;    /* TCP */
        hints.ai_flags = 0;
        hints.ai_protocol = 0;

1 Ответ

0 голосов
/ 13 мая 2019

В старые времена, до того, как IPv6 стал вещью, можно было предположить, что имя хоста может быть разумно разрешено для одного IP-адреса.

В настоящее время это просто не тот случай, getaddrinfo возвращает оба ipv4 иIPv6-адреса, и вам действительно нужно попробовать их обоих.Если вы уверены, что ваши пользователи будут в хороших сетях или ваши пользователи могут допускать длительные задержки, может быть достаточно попробовать последовательно «подключиться» к ним, но если вам нужно быстро установить соединения в потенциально разорванных сетях, это может оказаться бесполезным дляреализовать более сложный процесс (поиск «счастливые глазные яблоки»).

...