getaddrinfo et IPv6

J'essaie de comprendre ce que la fonction getaddrinfo retourne :

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netdb.h>

int main (int argc, char *argv[])
{


struct addrinfo *res = 0 ;

  getaddrinfo("localhost", NULL ,NULL,&res);
  printf("ai_flags -> %i\n", res->ai_flags) ;
  printf("ai_family -> %i\n", res->ai_family) ;
  printf("ai_socktype -> %i\n", res->ai_socktype) ;
  printf("ai_protocol -> %i\n", res->ai_protocol) ;
  printf("ai_addrlen -> %i\n", res->ai_addrlen) ;
  struct sockaddr_in* saddr = (struct sockaddr_in*)res->ai_addr;
  printf("ai_addr hostname ->  %s\n", inet_ntoa(saddr->sin_addr));

  freeaddrinfo(res);

  return 0 ;
}

résultats :

ai_flags -> 40
ai_family -> 2
ai_socktype -> 1
ai_protocol -> 6
ai_addrlen -> 16
ai_addr hostname ->  127.0.0.1

Dans /etc/hosts, je 'ai :

127.0.0.1 localhost    
::1     localhost

Getaddrinfo renvoie uniquement 127.0.0.1 et non pas ::1 ? Je ne comprends pas pourquoi ?

La deuxième question est: où puis-je trouver la signification de ces ints (40,2,1,6 etc) ? J'ai lu l'homme, mais il n'y a rien à ce sujet.

Je voulais aussi savoir si il est possible de donner une adresse IPv6 (par exemple ::1), et la fonction retourne le nom : localhost ?

Merci beaucoup !!

  • Selon la page de manuel, getaddrinfo alloue de l'espace et remplit une liste liée début at &res. Je pense qu'il serait de retour plus qu'une seule entrée, et vous devez parcourir la liste liée par res->ainext
InformationsquelleAutor lilawood | 2011-05-10