Difference between revisions of "La commande haah (host-address-address-host)"

From Livre IPv6

m
 
(One intermediate revision by one other user not shown)
Line 1: Line 1:
 +
{{suivi| Les primitives de conversion entre noms et adresses | Les primitives de conversion entre noms et adresses | Exemple de client/serveur TCP | Exemple de client/serveur TCP }}
 
L'exemple proposé n'est autre qu'une sorte de nslookup (très) simplifié. Si par exemple on lui donne en argument une adresse numérique (IPv4 ou IPv6), il imprime le nom complètement qualifié correspondant lorsque la requête DNS aboutit. L'extrait de session qui suit illustre l'utilisation de cette commande.
 
L'exemple proposé n'est autre qu'une sorte de nslookup (très) simplifié. Si par exemple on lui donne en argument une adresse numérique (IPv4 ou IPv6), il imprime le nom complètement qualifié correspondant lorsque la requête DNS aboutit. L'extrait de session qui suit illustre l'utilisation de cette commande.
  
Line 15: Line 16:
  
 
Le programme réalisant la commande <tt>haah</tt> ne présente aucune difficulté. C'est une simple application des primitives précédemment décrites.
 
Le programme réalisant la commande <tt>haah</tt> ne présente aucune difficulté. C'est une simple application des primitives précédemment décrites.
<tt>
+
 
{|
+
  1| #include <stdio.h> </tt>
|1||<tt>  #include <stdio.h> </tt>
+
  2|
|-
+
  3| #include <string.h>
|2||
+
  4| #include <errno.h>
|-
+
  5| #include <sys/types.h>
|3|| #include <string.h>
+
  6| #include <sys/socket.h>
|-
+
  7| #include <netinet/in.h>
|4|| #include <errno.h>
+
  8| #include <netdb.h>
|-
+
  9| #include <arpa/inet.h>
|5|| #include <sys/types.h>
+
10|
|-
+
  11|  
|6|| #include <sys/socket.h>
+
  12| int main(int argc, char **argv)
|-
+
13| {
|7|| #include <netinet/in.h>
+
14|    int ret;
|-
+
15|    struct addrinfo *res, *ptr;
|8|| #include <netdb.h>
+
16|    struct addrinfo hints = {
|-
+
17|      AI_CANONNAME,
|9|| #include <arpa/inet.h>
+
18|      PF_UNSPEC,
|-
+
19|      SOCK_STREAM,
|10||  
+
20|      0,
|-
+
21|      0,
|11|  
+
22|      NULL,
|-
+
23|      NULL,
|12|| int main(int argc, char **argv)
+
24|      NULL
|-
+
25|    };
|13|| {
+
26| 
|-
+
27|    if (argc != 2) {
|14||    int ret;
+
28|      fprintf(stderr, "%s: usage: %s host | addr.\n", *argv, *argv);
|-
+
29|      exit(1);
|15||    struct addrinfo *res, *ptr;
+
30|    }
|-
+
31|    ret = getaddrinfo(argv[1], NULL, &hints, &res);
|16||    struct addrinfo hints = {
+
32|    if (ret) {
|-
+
33|      fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
|17||      AI_CANONNAME,
+
34|      exit(1);
|-
+
35|    }
|18||      PF_UNSPEC,
+
37|    for (ptr = res; ptr; ptr = ptr->ai_next) {
|-
+
38|      if (ptr->ai_canonname)
|19||      SOCK_STREAM,
+
39|          fprintf(stdout,"Canonical name:\n%s\nAdresses:\n", ptr->ai_canonname);
|-
+
40|      switch (ptr->ai_family) {
|20||      0,
+
41|          case AF_INET:
|-
+
42|          {
|21||      0,
+
43|            char dst[INET_ADDRSTRLEN];
|-
+
44|            struct in_addr *src = &((struct sockaddr_in *) ptr->ai_addr)->sin_addr;
|22||      NULL,
+
45|       
|-
+
46|            if(!inet_ntop(AF_INET, (const void *) src, dst, sizeof(dst))) {
|23||      NULL,
+
47|                fprintf(stderr, "inet_ntop: %s\n", strerror(errno));
|-
+
48|                break;
|24||      NULL
+
49|            }
|-
+
50|            fprintf(stdout, "%s\n", dst);
|25||    };
+
51|            break;
|-
+
52|          }  
|26|
+
53|          case AF_INET6:
|-
+
54|          {
|27||    if (argc != 2) {
+
55|            char dst[INET6_ADDRSTRLEN];
|-
+
56|            struct in6_addr *src=&((struct sockaddr_in6 *)ptr->ai_addr)->sin6_addr;
|28||      fprintf(stderr, "%s: usage: %s host | addr.\n", *argv, *argv);
+
57|     
|-
+
58|            if (!inet_ntop(AF_INET6, (const void *) src, dst, sizeof(dst))) {
|29||      exit(1);
+
59|                fprintf(stderr, "inet_ntop: %s\n", strerror(errno));
|-
+
60|                break;
|30||    }
+
61|            }
|-
+
62|            fprintf(stdout, "%s\n", dst);
|31||    ret = getaddrinfo(argv[1], NULL, &hints, &res);
+
63|            break;
|-
+
64|          }
|32||    if (ret) {
+
65|          default:
|-
+
66|            fprintf(stderr, "getaddrinfo: %s\n", strerror(EAFNOSUPPORT));
|33||      fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
+
67|      }
|-
+
68|    }  
|34||      exit(1);
+
69|    freeaddrinfo(res);
|-
+
70|    exit(0);
|35||    }
+
71| }
|-
+
{{suivi| Les primitives de conversion entre noms et adresses | Les primitives de conversion entre noms et adresses | Exemple de client/serveur TCP | Exemple de client/serveur TCP }}
|37||    for (ptr = res; ptr; ptr = ptr->ai_next) {
+
|-
+
|38||      if (ptr->ai_canonname)
+
|-
+
|39||          fprintf(stdout,"Canonical name:\n%s\nAdresses:\n", ptr->ai_canonname);
+
|-
+
|40||      switch (ptr->ai_family) {
+
|-
+
|41||          case AF_INET:
+
|-
+
|42||          {
+
|-
+
|43||            char dst[INET_ADDRSTRLEN];
+
|-
+
|44||            struct in_addr *src = &((struct sockaddr_in *) ptr->ai_addr)->sin_addr;
+
|-
+
|45||       
+
|-
+
|46||            if(!inet_ntop(AF_INET, (const void *) src, dst, sizeof(dst))) {
+
|-
+
|47||                fprintf(stderr, "inet_ntop: %s\n", strerror(errno));
+
|-
+
|48||                break;
+
|-
+
|49||            }
+
|-
+
|50||            fprintf(stdout, "%s\n", dst);
+
|-
+
|51||            break;
+
|-
+
|52||          }  
+
|-
+
|53||          case AF_INET6:
+
|-
+
|54||          {
+
|-
+
|55||            char dst[INET6_ADDRSTRLEN];
+
|-
+
|56||            struct in6_addr *src=&((struct sockaddr_in6 *)ptr->ai_addr)->sin6_addr;
+
|-
+
|57||     
+
|-
+
|58||            if (!inet_ntop(AF_INET6, (const void *) src, dst, sizeof(dst))) {
+
|-
+
|59||                fprintf(stderr, "inet_ntop: %s\n", strerror(errno));
+
|-
+
|60||                break;
+
|-
+
|61||            }
+
|-
+
|62||            fprintf(stdout, "%s\n", dst);
+
|-
+
|63||            break;
+
|-
+
|64||          }
+
|-
+
|65||          default:
+
|-
+
|66||            fprintf(stderr, "getaddrinfo: %s\n", strerror(EAFNOSUPPORT));
+
|-
+
|67||      }
+
|-
+
|68||    }  
+
|-
+
|69||    freeaddrinfo(res);
+
|-
+
|70||    exit(0);
+
|-
+
|71|| }
+
|}
+
</tt>
+

Latest revision as of 12:53, 27 February 2006

Les primitives de conversion entre noms et adresses Table des matières Exemple de client/serveur TCP

L'exemple proposé n'est autre qu'une sorte de nslookup (très) simplifié. Si par exemple on lui donne en argument une adresse numérique (IPv4 ou IPv6), il imprime le nom complètement qualifié correspondant lorsque la requête DNS aboutit. L'extrait de session qui suit illustre l'utilisation de cette commande.

$ haah bernays
Canonical name:
bernays.ipv6.logique.jussieu.fr
Adresses:
2001:660:101:101:200:f8ff:fe31:17ec
3ffe:304:101:1:200:f8ff:fe31:17ec
$ haah 134.157.19.71
Canonical name:
bernays.logique.jussieu.fr
Adresses:
134.157.19.71
$

Le programme réalisant la commande haah ne présente aucune difficulté. C'est une simple application des primitives précédemment décrites.

 1| #include <stdio.h> </tt>
 2|
 3| #include <string.h>
 4| #include <errno.h>
 5| #include <sys/types.h>
 6| #include <sys/socket.h>
 7| #include <netinet/in.h>
 8| #include <netdb.h>
 9| #include <arpa/inet.h>
10|
11| 
12| int main(int argc, char **argv)
13| {
14|    int ret;
15|    struct addrinfo *res, *ptr;
16|    struct addrinfo hints = {
17|       AI_CANONNAME,
18|       PF_UNSPEC,
19|       SOCK_STREAM,
20|       0,
21|       0,
22|       NULL,
23|       NULL,
24|       NULL
25|    };
26|  	
27|    if (argc != 2) {
28|       fprintf(stderr, "%s: usage: %s host | addr.\n", *argv, *argv);
29|       exit(1);
30|    }
31|    ret = getaddrinfo(argv[1], NULL, &hints, &res);
32|    if (ret) {
33|       fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
34|       exit(1);
35|    }
37|    for (ptr = res; ptr; ptr = ptr->ai_next) {
38|       if (ptr->ai_canonname)
39|          fprintf(stdout,"Canonical name:\n%s\nAdresses:\n", ptr->ai_canonname);
40|       switch (ptr->ai_family) {
41|          case AF_INET:
42|          {
43|             char dst[INET_ADDRSTRLEN];
44|             struct in_addr *src = &((struct sockaddr_in *) ptr->ai_addr)->sin_addr;
45|      
46|             if(!inet_ntop(AF_INET, (const void *) src, dst, sizeof(dst))) {
47|                fprintf(stderr, "inet_ntop: %s\n", strerror(errno));
48|                break;
49|             }
50|             fprintf(stdout, "%s\n", dst);
51|             break;
52|          } 
53|          case AF_INET6:
54|          {
55|             char dst[INET6_ADDRSTRLEN];
56|             struct in6_addr *src=&((struct sockaddr_in6 *)ptr->ai_addr)->sin6_addr;
57|     
58|             if (!inet_ntop(AF_INET6, (const void *) src, dst, sizeof(dst))) {
59|                fprintf(stderr, "inet_ntop: %s\n", strerror(errno));
60|                break;
61|             }
62|             fprintf(stdout, "%s\n", dst);
63|             break;
64|          }
65|          default:
66|             fprintf(stderr, "getaddrinfo: %s\n", strerror(EAFNOSUPPORT));
67|       }
68|    } 
69|    freeaddrinfo(res);
70|    exit(0);
71| }
Les primitives de conversion entre noms et adresses Table des matières Exemple de client/serveur TCP
Personal tools