[C] recupérer son adresse IP

recupérer son adresse IP [C] - C - Programmation

Marsh Posté le 30-06-2004 à 18:14:18    

Bonjour,
voila, je cherche une methode pour recuperer sa propre adresse IP en C sous UNIX.
un peu comme si la fonction gethostaddr() existait :)
merci

Reply

Marsh Posté le 30-06-2004 à 18:14:18   

Reply

Marsh Posté le 30-06-2004 à 18:43:31    

j ai bien fait ca mais bon, ca me retourne 127.0.0.1, donc bof...
 

Code :
  1. #include <stdio.h>
  2. #include <netinet/in.h>
  3. #include <netdb.h>
  4. #include <arpa/inet.h>
  5. int main(void){
  6.   struct hostent * host;
  7.   host = gethostbyname("localhost" );
  8.   char * name = inet_ntoa(*(struct in_addr *)host->h_addr);
  9.   printf("name: %s\n",name);
  10.   return 0;
  11.   }


Message édité par kant23 le 30-06-2004 à 18:44:02
Reply

Marsh Posté le 30-06-2004 à 19:45:22    

c'est normal, tu donnes localhost, il va te retourner 127.0.0.1....
 
essaie de mettre le nom de ta machine plutôt...


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 30-06-2004 à 20:05:11    

ping localhost >> [127.0.0.1]
ping machinename >> [192.168.1.6]  


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 30-06-2004 à 22:22:42    

Le problème des noms c'est qu'ils peuvent changer...
 
Mieux vaut passer par l'interface.
 
Voir ioctl() avec SIOCGIFADDR pour récupérer l'adresse d'une interface donnée (et SIOCGIFCONF pour récupérer les interfaces dispo)


---------------
Incongru : une FAQ abandonnée sur les Standards du Web - FAQ périmée de blabla@Prog
Reply

Marsh Posté le 01-07-2004 à 09:04:44    

au lieu d'utiliser "localhost", tu peux pe utiliser les infos que te donne la fonction 'gethostname'. C'est sans doute suffisant pour ce que tu veux faire.

Reply

Marsh Posté le 01-07-2004 à 10:29:32    

SoWhatIn22 a écrit :

au lieu d'utiliser "localhost", tu peux pe utiliser les infos que te donne la fonction 'gethostname'. C'est sans doute suffisant pour ce que tu veux faire.


gethostname ne revoit que le nom de ma machine, ce qui donne exactement le même resultat...
je vais regarder du coté de ioctl(), mais ca m'a pas l air tres POSIX  
merci pour vos réponses

Reply

Marsh Posté le 01-07-2004 à 11:19:16    

gethostname va essayer de faire une résolution DNS ou NIS (j'en sais rien) pour retrouver le nom de la machine en question. Le resulat risque donc de ne pas être "localhost". A partir du vrai nom de la machine, tu pourras retrouver son IP publique.

Reply

Marsh Posté le 01-07-2004 à 11:31:04    

c'est ce que j'ai fait, j obtient le vrai nom de ma machine que me renvoit  127.0.0.1, c'est pareil avec ping d'ailleurs !
 

Code :
  1. [pierre@Perico sys]$ ping Perico -c1
  2. PING Perico (127.0.0.1) from 127.0.0.1 : 56(84) bytes of data.
  3. 64 bytes from Perico (127.0.0.1): icmp_seq=1 ttl=64 time=0.062 ms


 
mais je suis d'accord avec toi que ca devrait pas le faire (le DNS doit pas être bien configuré), mais si ca fait ca sur ma machine ca peut le faire sur une autre, et je prefere une solution que marchera a tous les coups, sans dependre du DNS


Message édité par kant23 le 01-07-2004 à 11:36:23
Reply

Marsh Posté le 01-07-2004 à 13:04:46    

Bon j ai trouvé comment faire avec ioctl, merci a vous :)
si ca interesse quelqun:
 

Code :
  1. #include <stdio.h>
  2. #include <sys/ioctl.h>
  3. #include <strings.h>
  4. #include <netinet/in.h>
  5. #include <arpa/inet.h>
  6. #include <sys/socket.h>
  7. int main(void){
  8.  
  9.   int sock = socket(PF_INET, SOCK_STREAM,0);
  10.   if(sock == -1) {
  11.     perror("main: socket \n" );
  12.     exit(1);
  13.   }
  14. u_int32_t nip;
  15. getMyIP(sock,"eth0",&nip);
  16. struct in_addr in;
  17. in.s_addr = nip;
  18. char * cip =  inet_ntoa( in );
  19. printf("my IP: %s\n",cip);
  20. return 0;
  21. }
  22. int getMyIP(int fd, char* ifname,  u_int32_t * ipaddr) {
  23.   /* fd: opened file descriptor
  24.    * ifname: if name eg: "eth0"
  25.    */
  26. #define IFNAMSIZ 16
  27. struct ifreq
  28. {
  29.     char ifr_name[IFNAMSIZ];
  30.     struct sockaddr ifr_addr;
  31. };
  32.   struct ifreq ifr;
  33.   memcpy(ifr.ifr_name,ifname,IFNAMSIZ);
  34.   if(ioctl(fd,SIOCGIFADDR,&ifr) == -1){
  35.     perror("getMyIP: ioctl" );
  36.     exit(-1);
  37. }
  38.   memcpy(ipaddr,&ifr.ifr_addr.sa_data[2],4);
  39.   return 0;
  40. }


Message édité par kant23 le 01-07-2004 à 13:14:24
Reply

Sujets relatifs:

Leave a Replay

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