2010-07-25 13 views
0

Je ne reçois pas ce devoir de trouver l'adresse IP de la machine. J'ai besoin d'aide pour comprendre la logique de ce code. Notre laboratoire d'université utilise un serveur proxy; ce code fonctionnera-t-il sur un ordinateur sans proxy?Besoin d'aide pour comprendre C programme pour trouver que les machines adresse IP

 #include <stdio.h>   /* stderr, stdout */ 
     #include <netdb.h>   /* hostent struct, gethostbyname() */ 
     #include <arpa/inet.h>  /* inet_ntoa() to format IP address */ 
     #include <netinet/in.h>  /* in_addr structure */ 

     int main(int argc, char **argv) { 
     struct hostent *host;  /* host information */ 
     struct in_addr h_addr; /* internet address */ 
     if (argc != 2) { 
      fprintf(stderr, "USAGE: nslookup <inet_address>\n"); 
      exit(1); 
     } 
     if ((host = gethostbyname(argv[1])) == NULL) { 
      fprintf(stderr, "(mini) nslookup failed on '%s'\n", argv[1]); 
      exit(1); 
     } 
     h_addr.s_addr = *((unsigned long *) host->h_addr_list[0]); 
     fprintf(stdout, "%s\n", inet_ntoa(h_addr)); 
     exit(0); 
     } 
+1

Avez-vous lu les pages de manuel des fonctions qui sont utilisées? Quelle partie ne comprenez-vous pas après cela? – Thomas

Répondre

2

Les 2 principales méthodes d'intérêt ici sont:

  1. gethostbyname() - Fonction La gethostbyname récupère les informations hôte
  2. inet_ntoa - convertir ip ajouter à in_addr

Essayez d'être précis , où avez-vous de la difficulté à comprendre le code.

Le code fonctionne avec moi.

$./a.out nslookup 

renvoie l'adresse IP de l'hôte.

+2

+1 pour relier Beej. –

+0

Ne pas obtenir la variable de pointeur * host et la condition à tester dans if() –

0

En fait, la fonction gethostbyname effectue une requête DNS qui renvoie la structure hostent archivée. Il pourrait être intéressant pour vous de passer en revue le réseau avec wireshark par exemple pour regarder à quoi ressemble le trafic.

1

netdb.h - définitions pour les opérations de base de données réseau arpa/inet.h - définitions pour les opérations sur Internet netinet/in.h - famille Adresse Internet La fonction retourne gethostname() le nom d'hôte standard pour la machine actuelle. inet_ntoa(h_addr) Pour convertir une adresse IP à partir du format réseau 32 bits en décimal à point.

Voici les termes de base de la compréhension. Plus important, utilisez google pour plus de détails.