Obtenir une ip en fonction d'un nom de domaine

Obtenir une ip en fonction d'un nom de domaine - C++ - Programmation

Marsh Posté le 05-03-2006 à 13:10:56    

Bonjour,
 
Je cherche une focntion compatible Win/Linux qui permettrait de retrouver l'ip d'un site grâce à son nom de domaine.
 
Merci...

Reply

Marsh Posté le 05-03-2006 à 13:10:56   

Reply

Marsh Posté le 05-03-2006 à 19:04:25    

gethostbyname

Reply

Marsh Posté le 05-03-2006 à 19:07:07    

à partir du nom de domaine tu peux avoir au mieux les ip des dns.
 
Après faut voir ce que tu entends par nom de domaine
 
Sans compter le fait que certains sites utilisent du round robin et donc un nom d'hôte peut renvoyer à plusieurs ip

Reply

Marsh Posté le 05-03-2006 à 20:20:07    

Merci pour vos réponses mais:
 

Code :
  1. const char *site = "http://zenux.free.fr";
  2. struct hostent *getip;
  3. getip = gethostbyname(site);
  4. cout<<getip->h_addr<<endl;


 
Ce code me fait un "Erreur de segmentation" : pourquoi ?


Message édité par casafa le 05-03-2006 à 20:20:52
Reply

Marsh Posté le 05-03-2006 à 20:51:01    

Voila un petit code que j'avais pour obtenir l'ip à partir d'un nom d'hôte:
le code est en C et fonctionne sous Unix et Win32:

Code :
  1. /*
  2. * Program name : get_ip.c
  3. * author : psyphi
  4. * e-mail : psyphi@gmail.com
  5. * last update : August 11 2005
  6. * compile : gcc -o getip get_ip.c -> Linux
  7. *           gcc -o getip get_ip.c -lwsock32 -> Windows
  8. * usage : ./getip <hostname>
  9. */
  10. #include <stdio.h>
  11. #include <errno.h>
  12. #if defined(WIN32)
  13. #include <winsock2.h>
  14. #pragma comment(lib, "ws2_32.lib" )
  15. #else
  16. #include <sys/socket.h>     /* pour avoir AF_INET */
  17. #include <netdb.h>          /* pour gethostbyname() & struct hostent */
  18. #include <netinet/in.h>     /* pour inet_ntoa() */
  19. #endif
  20. int main(int argc, char * argv[])
  21. {
  22.   #if defined(WIN32)
  23.   WSADATA WSAData;
  24.   WSAStartup(MAKEWORD(2,0), &WSAData);
  25.   #endif
  26.   if(argc!=2)
  27.   {
  28.     fprintf(stderr,"Usage : %s <hostname> \n",argv[0]);
  29.     exit(1);
  30.   }
  31.  
  32.   struct hostent * host=gethostbyname(argv[1]);
  33.  
  34.   if(!host)
  35.   {
  36.     fprintf(stderr,"host error\n" );
  37.     exit(1);
  38.   }
  39.  
  40.   fprintf(stdout,"Hostname : %s \n",host->h_name);
  41.   fprintf(stdout,"IP adress : %s \n",inet_ntoa(*((struct in_addr * )host->h_addr)));
  42.  
  43.   return 0;
  44. }

Reply

Marsh Posté le 05-03-2006 à 20:52:42    

genre WSAStartup c'ets une fonction Linux o_O ???

Reply

Marsh Posté le 05-03-2006 à 20:54:36    

Si tu lis bien tu verras que le compilateur prend en compte cette ligne seulement si il est sur une machine win32.
Ce programme fonctionne parfaitement sur linux et windows, je l'utilise sur ces deux plateformes.

Reply

Marsh Posté le 05-03-2006 à 21:12:42    

Merci pour ce code...
A la fin de ton code je croit qu'il manque ça ;) :
#if defined(WIN32)
 WSACleanup();
#endif
 
J'avais "Erreur de segmentation" à cause que je mettait "http://" dans le nom de domaine !


Message édité par casafa le 05-03-2006 à 21:12:55
Reply

Marsh Posté le 06-03-2006 à 11:06:47    

passke gethostbyname échoues et te retournes un NULL.

Reply

Marsh Posté le 07-03-2006 à 18:26:34    

Les lignes :
#if defined(WIN32)
 WSACleanup();
#endif  
ne sont pas obligatoire mais c'est plus propre tu as raison.
Pour éviter d'avoir une erreur de segmentation faut faire un test sur l'host.
C'est ce que je fais aux la lignes 38 -> 42.

Reply

Sujets relatifs:

Leave a Replay

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