récupérer sa propre IP

récupérer sa propre IP - C - Programmation

Marsh Posté le 27-02-2004 à 15:34:30    

Voila je suis à la recherche d'un petit bout de code qui me permettrtait d'afficher ma propre adresse ip .
j'arrive à afficher l'adresse du cient qui se onnecte mais pas mon adresse  
Pouvez-vous m'aider svp ?
 
Merci ,  

Reply

Marsh Posté le 27-02-2004 à 15:34:30   

Reply

Marsh Posté le 27-02-2004 à 15:36:11    

gethostbyname?

Reply

Marsh Posté le 27-02-2004 à 15:42:49    

puts("127.0.0.1" );
 
[:boidleau]

Reply

Marsh Posté le 27-02-2004 à 18:49:36    

plateforme ?
 
si windows : man GetIpAddrTable(), pour récuperer un tableau de toutes les ip de la machine
sinon chais pas.

Reply

Marsh Posté le 28-02-2004 à 12:41:35    

sous unix

Reply

Marsh Posté le 28-02-2004 à 12:45:26    

polo021 a écrit :

gethostbyname?


 
[:romf]

Reply

Marsh Posté le 28-02-2004 à 13:23:57    

pour une solution qui marche sous win/linux :
 
gethostname() puis gethostbyname(), les adresses IP des interfaces de la machine devraient etre dans le champ h_addr_list de la struct hostent* retournée.
 
(solution fouettante/deprecated sous win)

Reply

Marsh Posté le 04-03-2004 à 14:01:55    

j'ai cree un socket, je l'ai attaché au systeme sur un port  

Code :
  1. serv.sin_family = AF_INET;
  2. serv.sin_addr.s_addr = htonl(INADDR_ANY);
  3. serv.sin_port = htons(port);
  4. // attachement d'une adresse au socket
  5. if (bind (sock,(struct sockaddr *) &serv, sizeof serv) <0) {
  6.  perror("erreur attachement d'adresse (bind)" );
  7.  exit(1);
  8. }


 
et apres je fais ca

Code :
  1. cheminImage =  (char *) malloc(strlen((char *) get_current_dir_name())+ strlen(inet_ntoa(serv.sin_addr))+4+7);
  2. strcpy(cheminImage, "http://" );
  3. strcat(cheminImage, inet_ntoa(serv.sin_addr));
  4. strcat(cheminImage, (char *) get_current_dir_name());
  5. strcat(cheminImage, "/img" );
  6. printf("chemin %s", cheminImage);


 
et jobtiens
 
chemin http://0.0.0.0/home/mehdi/Tp3.Last/img
 
je pense que le probleme vient de INADDR_ANY lors de l'attahcment. non? comment faire sinon? parce que tout le reste de l'appli marche avec serv (de type sockaddr_in)
 
merci

Reply

Marsh Posté le 05-03-2004 à 00:46:49    

pfff, tout me fait chier en ce moment et pas envie d'expliquer pourquoi ton code veut rien dire, mais bon vais tenter : tu as une socket que tu 'bind' a une adresse locale, ici affectée INADDR_ANY, qui est égale a 0x00000000, alors forcément l'appel a inet_ntoa te renvoie 0.0.0.0.
 
en gros INADDR_ANY est fait pour écouter sur une machine sans se soucier de ses adresses ip.
 
un bout de la solution :  

Code :
  1. char name[256];
  2. gethostname(name, 256);
  3. hostent *host = gethostbyname(name);


après demerde toi pour récuperer toutes tes ip, elles sont quelquepart dans host->h_addr_list.

Reply

Marsh Posté le 05-03-2004 à 14:23:43    

gethostname(name, 256);  
 
dans name, j'ai m63.net195-131-236.noos.fr
 
et du coup gethostbyname fait nimp...

Reply

Marsh Posté le 05-03-2004 à 14:23:43   

Reply

Marsh Posté le 05-03-2004 à 14:28:57    

ca te va pas ça ?
 

Code :
  1. hptr=gethostbyname("localhost" );

Reply

Marsh Posté le 05-03-2004 à 14:49:36    

Code :
  1. h = gethostbyname("localhost" );
  2. if (h == NULL)
  3. printf("NULL\n" );
  4. printf("%s\n", *(h->h_addr_list));
  5. //ou
  6. printf("%s\n", (h->h_addr_list)[0]);


 
et ca affiche RIEN... comprend pas la


Message édité par meumeul le 05-03-2004 à 14:52:33
Reply

Marsh Posté le 05-03-2004 à 16:32:31    

meumeul a écrit :

Code :
  1. h = gethostbyname("localhost" );
  2. if (h == NULL)
  3. printf("NULL\n" );
  4. printf("%s\n", *(h->h_addr_list));
  5. //ou
  6. printf("%s\n", (h->h_addr_list)[0]);


 
et ca affiche RIEN... comprend pas la


 
C'est normal puisqu'il y a quatre octets dans ton (h->h_addr_list)[0]. Que représentent-ils d'après toi ?

Reply

Marsh Posté le 05-03-2004 à 16:37:01    

putain mais tu vas lire la doc !
 
chuis pas un fan de ce genre de réponse, mais la c'est obligé :
man gethostbyname
man hostent
 
en gros c'est pas stocké sous forme de char*.

Reply

Marsh Posté le 05-03-2004 à 18:16:18    

moi je lis  
struct hostent {
 
...
char ** h_addr_list;
 
}
 
mé bon

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed