Comment obtenir mon non-bouclage de l'adresse ip sur le réseau en C?

Pour une communication entre deux hôtes, j'ai besoin d'envoyer l'adresse IP de mon hôte à l'autre site. Le problème est que si je demande à mon adresse IP, il se peut que je sois de retour ma boucle locale adresse IP (127.x.x.x) , et non pas le réseau (ethernet) de l'adresse IP.

J'utilise le code suivant:

char myhostname[32];


gethostname(myhostname, 32);
hp = gethostbyname(myhostname);
unsigned my_ip = *(unsigned*)(hp->h_addr);

if( (my_ip % 256) == 127) {
  /* Wrong IP adress as it's 127.x.x.x */
  printf("Error, local IP address!");
  return;
}

La seule façon de le résoudre est de faire en sorte que mon nom d'hôte dans le fichier /etc/hosts est en retard par rapport à l'adresse de réseau, pas de la boucle locale (la valeur par défaut, par exemple Ubuntu).

Est-il un moyen de résoudre ce sans compter sur le contenu de /etc/hosts?

Edit: j'ai changé le code ci-dessus de sorte qu'il rend l'utilisation de getaddrinfo, mais j'ai toujours revenir le bouclage du périphérique de nombre (de 127,0,0,1) au lieu de l'adresse IP réelle:

struct addrinfo hint = {0};
struct addrinfo *aip = NULL;
unsigned ip = 0;
struct sockaddr_in *sinp = NULL;

hint.ai_family = AF_INET; /* IPv4 */
hint.ai_socktype = SOCK_STREAM;

if(getaddrinfo(hostname, NULL, &hint, &aip) != 0) {
    return 0;
}
sinp = (struct sockaddr_in *) aip->ai_addr;
ip   = *(unsigned *) &sinp->sin_addr;

(J'ai utilisé pour obtenir une liste de 3 addrinfo avec les trois SOCK_STREAM,SOCK_DGRAM et SOCK_RAW, mais l'indicateur empêche qu')

Donc ma question est toujours debout...

gethostbyname est déconseillé pour de nombreux, de nombreuses années (l'une des raisons étant qu'il fonctionne avec une seule adresse de la famille). Comme mentionné par qrdl, vous devez utiliser getaddrinfo
Ok, merci pour l'info. Ce code d'origine est de 12 ans.

OriginalL'auteur Roalt | 2009-03-09