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...
Ok, merci pour l'info. Ce code d'origine est de 12 ans.
OriginalL'auteur Roalt | 2009-03-09
Vous devez vous connecter pour publier un commentaire.
Il est POSIX fonction
getaddrinfo()
que les rendements liés liste d'adresses pour donné le nom d'hôte, vous avez juste besoin d'aller au moyen de cette liste et de trouver des non-adresse de bouclage.Voir
man getaddrinfo
.OriginalL'auteur qrdl
Pas une réponse, mais un commentaire pertinent: sachez que dès que vous commencez à envoyer des informations d'adressage dans le contenu des paquets, vous courez le risque de faire une demande incapable de travailler à travers NAT:ing routeurs et/ou à travers les pare-feu.
Ces technologies s'appuient sur les informations, en-têtes de paquets IP pour garder une trace de la circulation, et si les demandes d'échange d'informations d'adressage à l'intérieur de paquets, où ils restent invisibles de cette inspection, ils risqueraient de se casser.
Bien sûr, cela pourrait être totalement hors de propos à votre demande, mais j'ai pensé qu'il convient de souligner dans ce contexte.
Attention: le code a une façon de durer plus longtemps au-delà de votre intention d'origine. Juste être conscient qu'un jour, quelqu'un va vouloir l'exécuter au-delà du réseau local. (Cela ne peut faire aucun sens, mais ils veulent le faire).
OriginalL'auteur unwind
L'adresse de départ sera inclus dans le paquet envoyé... il n'y a pas besoin de reproduire cette information. Il est obtenu lors de l'acceptation de la communication de l'hôte distant (voir beej guide du travail en réseau, notamment avec la partie sur accept())
OriginalL'auteur workmad3
J'ai juste couru dans une situation où, quand seulement /etc/hosts a l'information en elle et quand j'ai utilisé getaddrinfo pour obtenir l'adresse IP de la liste, il est retourné 127.0.0.1 à chaque fois. Comme il s'est avéré, le nom d'hôte est un alias de localhost...chose qui est souvent facile d'oublier. Voici ce qui s'est passé:
Le fichier /etc/hosts:
127.0.0.1 localhost.localdomain localhost foo
::1 localhost6.localdomain6 localhost6
172.16.1.248 foo
172.16.1.249 bie
172.16.1.250 bletch
Donc, maintenant, lorsque vous appelez getaddrinfo avec host="foo", il renvoie 127.0.0.1 3 fois. L'erreur ici est que les foo apparaît à la fois sur la ligne "127.0.0.1" et "172.16.1.248". Une fois que j'ai enlevé foo de la ligne "127.0.0.1" tout s'était bien passé.
Espère que cela aide quelqu'un.
OriginalL'auteur
Regardez ceci:
Découvrir IP publique par programmation
Noter que, dans certains cas, un ordinateur peut avoir plus d'un non-bouclage de l'adresse IP, et dans ce cas, les réponses à la question vous dire comment obtenez celui qui est exposé à l'internet.
La accepté de répondre, au moins, est toujours d'actualité -, vous pouvez avoir accès à ce site à partir de C.
OriginalL'auteur David Z
Même si l'ordinateur n'a qu'une interface réseau physique (une hypothèse qui peut ou ne peut pas tenir, même les netbooks ont deux - ethernet et WIFI), Vpn pouvez ajouter encore plus d'adresses IP. De toute façon, l'hôte de l'autre côté doit être en mesure de déterminer l'adresse IP de votre hôte utilisé pour le contacter.
OriginalL'auteur Erich Kitzmueller
Utilisation
getaddrinfo()
OriginalL'auteur vartec
Vous y êtes presque. Je ne suis pas sûr de savoir comment vous obtenez
my_ip
dehp
.gethostbyname()
renvoie un pointeur sur unehostent
structure qui a uneh_addr_list
champ.La
h_addr_list
champ est null liste de toutes les adresses ip liés à l'hôte.Je pense que vous obtenez l'adresse de bouclage parce que c'est la première entrée dans
h_addr_list
.EDIT: Il doit travailler à quelque chose comme ceci:
J'ai ajouté la ligne qui a obtenu le my_ip de hp maintenant à la question initiale.
OriginalL'auteur Ferruccio
Si /etc/hosts est toujours là et toujours le même, à la recherche de toutes les entrées de h_addr_list ne va pas aider.
Essayer de se débarrasser de (renommer en cas de doute) le fichier /etc/hosts, alors vous obtiendrez les eth0 IP directement, si cela est acceptable pour vous. Probablement le plus mauvais choix, mais si vous avez juste une machine à s'inquiéter...
OriginalL'auteur gc .
Votre nouveau code câblez l'utilisation d'IPv4 (dans l'indicateur.ai_family champ) qui est une idée terrible.
En dehors de cela, vous êtes, vous venez devrait boucle à travers les résultats de getaddrinfo. Votre code devient la première adresse IP, mais il y a un aip->ai_next champ à suivre...
Comme je l'ai dit dans un commentaire à la question, le algorith est imparfait, de toute façon. Ma réponse était juste pour expliquer comment mettre en œuvre les conclusions de l'algorithme 🙂
OriginalL'auteur bortzmeyer