3 votes

Obtention de sa propre adresse IP externe en POSIX C

Je cherche à obtenir ma propre adresse IP afin de publier cette information dans un réseau Peer-to-Peer. En POSIX/C, nous avons getaddrinfo(NULL, ...) mais cela semble toujours revenir INADDR_ANY o INADDR_LOOPBACK ce qui est inutile pour moi.

Des suggestions ?

5voto

bortzmeyer Points 12246

L'un des problèmes est que, même si vous obtenez l'adresse IP locale, l'adresse IP vue par le reste de l'Internet peut être différente, en raison de la complexité du processus d'authentification. NAT ce qui est malheureusement très courant. L'utilisation de l'IPv6 supprimera probablement ce problème, mais ce n'est peut-être pas une option pour vous, actuellement.

Pour obtenir le public adresse IP, vous aurez besoin d'un protocole conçu à cet effet tel que STUN ( RFC 5389 ). Il existe serveurs STUN publics et déjà existants Clients STUN en C .

Tous les programmes de pair à pair ont des problèmes similaires, alors apprenez ce que font les autres, je vous recommande vivement de lire le document suivant RFC 5128, "State of Peer-to-Peer (P2P) Communication across Network Address Translators (NATs)" (État de la communication pair-à-pair (P2P) à travers les traducteurs d'adresses de réseau) .

1voto

Andy Points 2015

Par adresse publique, vous voulez dire, une adresse avec laquelle les pairs de votre application peuvent vous contacter. La seule façon de s'en assurer est de se connecter à un pair "externe" connu et de lui demander de vous renvoyer votre adresse.

1voto

Arthur Ulfeldt Points 45059

Je n'essaie pas de rendre les choses plus compliquées, mais je dois préciser qu'un seul ordinateur peut avoir plusieurs adresses IP. En général, chaque carte réseau en a une.

Une façon plus spécifique de demander serait "comment trouver l'adresse IP qui sera utilisée comme adresse source lorsque je me connecterai à foo.com.org". J'aime bien la réponse de bortzmeyer à ce sujet :)

0voto

bdonlan Points 90068

Créer un socket UDP, bind() à INADDR_ANY, connecter() à une adresse sur internet, puis utiliser getsockname() sur le socket pour trouver l'adresse qui lui a été assignée.

Une autre bonne solution, si le protocole du réseau la prend en charge, consiste à demander à vos pairs de démarrage ce qu'ils pensent être votre adresse IP. Les NATs sont ainsi automatiquement pris en charge.

0voto

qrdl Points 17813

Avez-vous vérifié ai_next champ de la structure retournée ?

getaddrinfo() renvoie une liste d'adresses liées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X