adresse locale
Le
Danious
Bonjour,
dans le cadre d'un projet bittorent avec les sockets en C, je suis
arrive a un probleme : je n'arrive pas a obtenir l'adresse du serveur
(exemple 102.235.2.65) qui lance le bittorent pour l'envoyer aux
clients. En effet, j'utilise une socket dont l'adresse est initialisee
a INADDR_ANY (logique) , et cela correspond a l'adresse IP 0.0.0.0.
Quand j'envoie cette adresse aux autres clients, ceux-ci recoivent
127.0.0.1 (adresse locale) et evidemment, ils ne peuvent plus se
connecter au serveur par cette adresse puisque cette adresse correspond
aussi a LEUR adresse locale. Ainsi, tout mon projet fonctionne si le
serveur et les client sont tous en branches en local.
Je crois qu'il existe en java une fonction qui permet de faire ce que
je veux (je crois que c'est quelque chose du type getLocalHost()) ;
y-a-t-il un equivalent en C?
Remarque : j'imagine deja que tout le monde va me repondre : mais
pourquoi tu as besoin de faire ca vu que les clients recoivent
l'adresse du serveur des le premier recv ou recvfrom? En fait, le
serveur contient lui-meme un client, et vu que le serveur envoie
l'adresse des clients a d'autres clients, il envoie l'adresse 127.0.0.1
au lieu de l'adresse IP reelle
Merci
dans le cadre d'un projet bittorent avec les sockets en C, je suis
arrive a un probleme : je n'arrive pas a obtenir l'adresse du serveur
(exemple 102.235.2.65) qui lance le bittorent pour l'envoyer aux
clients. En effet, j'utilise une socket dont l'adresse est initialisee
a INADDR_ANY (logique) , et cela correspond a l'adresse IP 0.0.0.0.
Quand j'envoie cette adresse aux autres clients, ceux-ci recoivent
127.0.0.1 (adresse locale) et evidemment, ils ne peuvent plus se
connecter au serveur par cette adresse puisque cette adresse correspond
aussi a LEUR adresse locale. Ainsi, tout mon projet fonctionne si le
serveur et les client sont tous en branches en local.
Je crois qu'il existe en java une fonction qui permet de faire ce que
je veux (je crois que c'est quelque chose du type getLocalHost()) ;
y-a-t-il un equivalent en C?
Remarque : j'imagine deja que tout le monde va me repondre : mais
pourquoi tu as besoin de faire ca vu que les clients recoivent
l'adresse du serveur des le premier recv ou recvfrom? En fait, le
serveur contient lui-meme un client, et vu que le serveur envoie
l'adresse des clients a d'autres clients, il envoie l'adresse 127.0.0.1
au lieu de l'adresse IP reelle
Merci

Poser une question


Soit tu as une adresse IP fixe et il pourrait être interessant de s'en
rappeler, à défaut utiliser gethostbyname().
Soit tu a une adresse IP dynamique, auquel cas elle t'est en principe
donnée lors de la négociation de ta connexion avec ton ISP, la ranger
dans un coin à ce moment pour s'en resservir.
--
http://harpo.free.fr/
malheureusement, la fonction gethostbyname ne permet pas de retrouver
l'adresse IP de ma machine (car j'utilise comme parametre "localhost"
(rappel:on ne sait pas a priori qui lance le serveur)). neanmoins, j'ai
trouve la solution : utiliser la fonction uname (qui recupere des infos
sur la machine ou on se trouve). Et en faisant un gethostbyname de
l'info obtenue par uname, on peut ainsi recupere sa veritable IP.
Tres interessant pour quiconque rencontre le meme probleme que moi
a+
gethostbyname( "localhost" ) devrait donner le nom de la machine dans
h_ent et sans doute l'adresse IP, ou alors rappeler gethostbyname avec
le nom obtenu.
Du moins s'il y a la ligne correspondante dans /etc/hosts
Ca revient à peu près au même, il y a aussi gethostname( ).
Malheureusement tout ça ne donne pas l'IP quand elle est dynamique.
--
http://harpo.free.fr/
<HS>
en fait, c'est une fois que tu as établi la connexion que tu peux
obtenir l'adresse IP locale. L'adresse IP locale dépend en effet de la
règle de routage qui a été choisie pour se connecter à la machine
distante.
getsockname/getpeername permet d'avoir les informations
respectivement sur la socket locale/distante (notamment, adresse IP et
port utilisé).
</HS>
--
DINH V. Hoa,
"elle est belle comme un sac à sapin" -- cedric
h_ent ? je n'ai aucun champ de la structure hostent qui s'appelle
h_ent, mais j'ai bien un champ h_name (voir methode 1).
cela ne marche pas (voir la methode 1)
effectivement, celle ci marche bien aussi (methode 3)
En clair, voila ce que j'ai comme petit programme de test :
#include #include #include #include
main()
{
struct sockaddr_in x;
struct hostent *y,*z;
struct utsname u;
/*1e methode : ne fonctionne pas*/
z=gethostbyname("localhost");
y=gethostbyname(z->h_name);
memcpy(&x.sin_addr,y->h_addr,sizeof(y->h_addr));
printf("%sn",inet_ntoa(x.sin_addr));
/*2e methode : uname fonctionne*/
uname(&u);
y=gethostbyname(u.nodename);
memcpy(&x.sin_addr,y->h_addr,sizeof(y->h_addr));
printf("%sn",inet_ntoa(x.sin_addr));
/*3e methode : gethostname fonctionne*/
char *s;
s=malloc(26);
gethostname(s,25);
y=gethostbyname(s);
memcpy(&x.sin_addr,y->h_addr,sizeof(y->h_addr));
printf("%sn",inet_ntoa(x.sin_addr));
}
cela affiche :
127.0.0.1
130.79.7.1
130.79.7.1
(130.79.7.1 : adresse de la fac ou j'ai teste le prog)
en tout cas, merci encore pour les reponses
a+