Est-il nécessaire d’essayer de se connecter à toutes les adresses renvoyées par getaddrinfo ()?

L’ exemple de code Simple Client de Beej itère sur toutes les adresses IP renvoyées par getaddrinfo (), jusqu’à ce qu’il puisse se connecter à la première. Voir le code ci-dessous.

Est-ce toujours nécessaire ou faut-il supposer qu’il suffit d’essayer de se connecter à la première adresse renvoyée par getaddrinfo ()?

memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if ((rv = getaddrinfo(argv[1], PORT, &hints, &servinfo)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); return 1; } // ------------------------------------------------------------ // loop through all the results and connect to the first we can for(p = servinfo; p != NULL; p = p->ai_next) { if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { perror("client: socket"); continue; } if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) { close(sockfd); perror("client: connect"); continue; } break; } 

Oui, vous devez effectuer une itération sur toutes les adresses – en particulier, considérons le cas où les adresses IPv6 de l’hôte de destination sont activées mais que votre hôte local ne le fait pas. getaddrinfo() retournera les AF_INET6 famille AF_INET6 , mais l’appel de socket() ou de connect() échouera.

Il est également possible que votre hôte SOCK_STREAM charge plusieurs protocoles implémentant SOCK_STREAM (par exemple, SCTP en plus de TCP) et que l’hôte de destination ne le fasse pas – puisque vous n’avez pas défini le membre ai_protocol de la structure de conseils, être retourné.

En plus des autres réponses données ci-dessus, considérons le cas habituel selon lequel, pour des sites Web plus grands, etc., plusieurs enregistrements A pourraient être publiés, à des fins de redondance. Si un connect() à la première adresse échoue, vous voulez également essayer les autres.

Voyons comment ça se passe … Le serveur hôte auquel vous souhaitez vous connecter peut avoir plusieurs adresses associées, mais le programme serveur actuel n’écoute que l’une de ces adresses. Si votre client ne connaît pas l’adresse exacte écoutée par le programme du serveur, vous devez essayer toutes les adresses de l’hôte jusqu’à ce que vous trouviez la bonne et que vous puissiez vous connecter.

Oui, vous devriez les parcourir toutes – il n’est pas garanti que la première adresse (ou celle que vous choisissiez) des adresses soit réellement valide. C’est pourquoi c’est fait comme ça dans le tutoriel.

En supposant que vous soyez nouveau sur socket, à ce stade. Oui, cela est crucial car après avoir utilisé getaddrinfo, vous pouvez récupérer une adresse pour une validation ultérieure.