Je n'arrive pas à récupérer mon adresse réseau _externe_

Je n'arrive pas à récupérer mon adresse réseau _externe_ - C - Programmation

Marsh Posté le 13-12-2005 à 23:44:31    

Bonsoir,
 
j'ai un problème pour récupérer mon adresse réseau externe... je n'y arrive pas !
 

  • INADDR_ANY ne convient pas, il écrit 0 dans le sockaddr_in.sin_addr et en récupérant avec inet_ntoa j'obtiens 0.0.0.0
  • gethostbyname nécessite l'entrée d'un paramètre... je veux que tout soit automatique
  • en récupérant le nom de la machine avec gethostname puis en l'envoyant à gethostbyname, j'obtiens l'adresse locale...


Connaissez vous la solution :??:
 
Ce n'est pas pour faire un bind mais pour que de l'extérieur des clients puisse se connecter à la machine à partir de cette adresse. Et la machine serveur n'est pas toujours la même donc je peux pas non plus faire un truc du genre #define HOSTNAME "trucblabla".
 
Merci.

Reply

Marsh Posté le 13-12-2005 à 23:44:31   

Reply

Marsh Posté le 14-12-2005 à 00:19:26    

sous linux on peut utiliser un appel ioctl (SIOCGIFADDR)

Code :
  1. // choppe_ip eth0 par exemple, ce qui renvoie "IP Adress of 'eth0' is '192.168.1.10'" sur ma babasse
  2. #include <stdio.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <sys/types.h>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11. #include <sys/ioctl.h>
  12. #include <net/if.h> // struct ifreq
  13. int get_my_extern_ip(const char * interface) {
  14. int test_sock=0;
  15. struct sockaddr_in *addrp = NULL;
  16. struct ifreq ifr;
  17. test_sock = socket( PF_INET, SOCK_DGRAM, 0 );
  18. if( test_sock == -1 ) {
  19.   fprintf( stderr, "Cannot obtain socket :%s\n",strerror(errno));
  20.   return -1;
  21. }
  22. memset( &ifr, 0, sizeof( struct ifreq ) );
  23. strncpy( ifr.ifr_name, interface, IFNAMSIZ);
  24. // on obtient l'adresse de l'adresse l'interface via SIOCGIADDR
  25. if( ioctl( test_sock, SIOCGIFADDR, &ifr ) == -1 ) {
  26.   fprintf( stderr, "Cannot obtain IP address of '%s': %s\n",interface,strerror(errno));
  27.   close(test_sock);
  28.   return -1;
  29. }
  30. close(test_sock);
  31. addrp = (struct sockaddr_in *)&(ifr.ifr_addr);
  32. fprintf(stdout, "IP Adress of '%s' is '%s'\n",interface,inet_ntoa(addrp->sin_addr));
  33. return 0;
  34. }
  35. int main( int argc, char ** argv ) {
  36.   get_my_extern_ip( argv[1] );
  37.   return 0;
  38. }


 
 

Reply

Marsh Posté le 14-12-2005 à 00:29:03    

Merci :)
Donc, comme je veux que ce soit automatique, si je teste eth0, eth1, etc jusqu'à trouvé une adresse autre que 127.0.0.1, 192.168.*.* et 10.*.*.* ça devrait bien marcher ?
 
Ligne 21, y'a t'il une contre indication au remplacement de PF_INET par AF_INET ?

Message cité 2 fois
Message édité par souliane le 15-12-2005 à 15:24:11
Reply

Marsh Posté le 14-12-2005 à 01:01:32    

souliane a écrit :

Merci :)
Ligne 21, y'a t'il une contre indication au remplacement de PF_INET par AF_INET ?


non je pense pas, d'autant que c'est synonyme il me semble. Ya plus qu'a essayer.

Reply

Marsh Posté le 14-12-2005 à 01:44:34    

Merci encore et bonne nuit !

Reply

Marsh Posté le 14-12-2005 à 13:54:31    

Ca marche super :)
 
Je n'ose pas imaginer tout ce qu'on peut faire avec ioctl quand on sait bien l'utiliser !

Reply

Marsh Posté le 14-12-2005 à 18:58:01    

souliane a écrit :

Ligne 21, y'a t'il une contre indication au remplacement de PF_INET par AF_INET ?


Oui. Ce sont deux valeurs différentes qui n'ont rien à voir.
 
socket() : PF_INET
bind() etc. : AF_INET


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

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