GNT sans publicité, site mobile, fonctionnalitées exclusives...

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
Lire les 9 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Harpo
Le #925075
Danious wrote:


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?


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/

Danious
Le #1018745
merci beaucoup
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+
Harpo
Le #1018568
Danious wrote:

merci beaucoup
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)).


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

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.


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/

DINH Viêt Hoà
Le #1018564

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.


<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

Danious
Le #1018426
gethostbyname( "localhost" ) devrait donner le nom de la machine dans
h_ent


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).

ou alors rappeler gethostbyname avec le nom obtenu


cela ne marche pas (voir la methode 1)

Ca revient à peu près au même, il y a aussi gethostname( ).


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+

Publicité
Suivre les réponses
Poster une réponse
Anonyme