URL: https://linuxfr.org/forums/programmation-c--2/posts/commande-pour-le-r%C3%A9solveur-de-la-libc Title: Commande pour le résolveur de la libc Authors: 🚲 Tanguy Ortolo Date: 2010年08月17日T15:55:46+02:00 Tags: Score: 5 Vous savez sans doute que les logiciels clients réseau ne font généralement pas eux-mêmes leurs résolutions de noms d'hôtes en adresse IP : ils utilisent des fonctions de la libc, comme gethostbyname(3) ou getaddrinfo(3). De son côté, la libc utilise le fichier de configuration nsswitch.conf(5) pour déterminer les méthodes à utiliser pour résoudre le nom qu'on lui soumet. En général, c'est : 1. le fichier statique hosts(5) ; 1. une requête mDNS ; 1. une requête DNS. D'autres méthodes sont disponibles, comme LDAP ou YP. Avez-vous déjà eu besoin de savoir comme un logiciel, autrement dit la libc, allait résoudre un nom donné ? La commande host(1) ne convient pas, puisqu'elle fait juste de la résolution DNS. Et bien, voici une interface en ligne de commande pour le résolveur de la libc : #include <stdio.h> #include <netdb.h> #include <arpa/inet.h> void print_host_info(struct hostent *host) { £spaces£ £/spaces£int i ; £spaces£ £/spaces£char *addr ; £spaces£ £/spaces£char paddr[INET6_ADDRSTRLEN] ; £spaces£ £/spaces£printf("Name: %s\n", host->h_name) ; £spaces£ £/spaces£printf("Aliases:") ; £spaces£ £/spaces£for (i = 0 ; host->h_aliases[i] != NULL ; i++) £spaces£ £/spaces£{ £spaces£ £/spaces£printf(" %s", host->h_aliases[i]) ; £spaces£ £/spaces£} £spaces£ £/spaces£printf("\n") ; £spaces£ £/spaces£printf("Address type: ") ; £spaces£ £/spaces£switch (host->h_addrtype) £spaces£ £/spaces£{ £spaces£ £/spaces£case AF_INET : printf("inet\n") ; £spaces£ £/spaces£break ; £spaces£ £/spaces£case AF_INET6 : printf("inet6\n") ; £spaces£ £/spaces£break ; £spaces£ £/spaces£} £spaces£ £/spaces£printf("Address length: %d\n", host->h_length) ; £spaces£ £/spaces£printf("Addresses:") ; £spaces£ £/spaces£for (i = 0 ; host->h_addr_list[i] != NULL ; i++) £spaces£ £/spaces£{ £spaces£ £/spaces£addr = host->h_addr_list[i] ; £spaces£ £/spaces£printf(" %s", inet_ntop(host->h_addrtype, addr, paddr, INET6_ADDRSTRLEN)) ; £spaces£ £/spaces£} £spaces£ £/spaces£printf("\n") ; } int main(int argc, char **argv) { £spaces£ £/spaces£if (argc != 2) £spaces£ £/spaces£{ £spaces£ £/spaces£printf("Need a single hostname.\n") ; £spaces£ £/spaces£return 1 ; £spaces£ £/spaces£} £spaces£ £/spaces£struct hostent *host ; £spaces£ £/spaces£char host4 = 0, host6 = 0 ; £spaces£ £/spaces£if ((host = gethostbyname2(argv[1], AF_INET))) £spaces£ £/spaces£{ £spaces£ £/spaces£host4 = 1 ; £spaces£ £/spaces£print_host_info(host) ; £spaces£ £/spaces£} £spaces£ £/spaces£if (host4) £spaces£ £/spaces£{ £spaces£ £/spaces£printf("\n") ; £spaces£ £/spaces£} £spaces£ £/spaces£if ((host = gethostbyname2(argv[1], AF_INET6))) £spaces£ £/spaces£{ £spaces£ £/spaces£host6 = 1; £spaces£ £/spaces£print_host_info(host) ; £spaces£ £/spaces£} £spaces£ £/spaces£if (!host4 && !host6) £spaces£ £/spaces£{ £spaces£ £/spaces£printf("Host not found.\n") ; £spaces£ £/spaces£} £spaces£ £/spaces£return 0 ; } Ça s'utilise de la façon la plus simple qui soit : gcc -Wall -o resolv resolv.c ./resolv www.linuxfr.org

AltStyle によって変換されたページ (->オリジナル) /