inet_net_pton(3) Library Functions Manual inet_net_pton(3) NOM inet_net_pton, inet_net_ntop - Conversion d'adresse reseau Internet BIBLIOTHEQUE Bibliotheque resolver (libresolv, -lresolv) SYNOPSIS #include int inet_net_pton(int af, const char *pres, void netp[.nsize], size_t nsize); char *inet_net_ntop(int af, const void netp[(.bits - CHAR_BIT + 1) / CHAR_BIT], int bits, char pres[.psize], size_t psize); Exigences de macros de test de fonctionnalites pour la glibc (consulter feature_test_macros(7)) : inet_net_pton(), inet_net_ntop() : Depuis la glibc 2.20 : _DEFAULT_SOURCE Avant la glibc 2.20 : _BSD_SOURCE || _SVID_SOURCE DESCRIPTION Ces fonctions convertissent les adresses de reseau entre leur format de representation (c-a-d. textuelle) et leur format binaire pour le reseau. Dans le cas des deux fonctions, af indique la famille d'adresse a utiliser lors de la conversion. Seule la valeur AF_INET est prise en charge. inet_net_pton() La fonction inet_net_pton() convertit pres, une chaine terminee par un caractere nul et contenant la representation d'une adresse reseau vers le format reseau. Le resultat de la conversion, dans l'ordre du reseau, est place dans le tampon pointe par netp. (Le parametre netp pointe typiquement vers une structure in_addr.) Le parametre nsize indique le nombre d'octets disponibles dans netp. En cas de reussite, inet_net_pton() renvoie le nombre de bits dans le champ de numero de reseau du resultat place dans netp. Pour une discussion sur le format de presentation de l'entree et la valeur de retour, consultez NOTES. Remarque : le tampon pointe par netp devrait etre mis a zero avant d'appeler inet_net_pton() puisque l'appel n'ecrit que le nombre d'octets necessaire pour le numero de reseau (ou qu'explicitement indique par pres), ce qui pourrait etre moins que le nombre d'octets dans une adresse de reseau complete. inet_net_ntop() La fonction inet_net_ntop() convertit le numero de reseau dans le tampon pointe par netp au format de presentation ; *netp est interprete comme une valeur dans l'ordre d'octets du reseau. L'argument bits indique le nombre de bits dans le numero de reseau *netp. La chaine au format de presentation terminee par NULL est placee dans le tampon pointe par pres. L'argument psize indique le nombre d'octets disponibles dans pres. La chaine de presentation est au format CIDR : notation decimale pointee representant l'adresse reseau, suivie par une barre oblique et la taille du numero de reseau en bit. VALEUR RENVOYEE Si elle reussit, inet_net_pton() renvoie le nombre de bits de l'adresse reseau. En cas d'erreur, -1 est renvoye et errno est defini pour indiquer l'erreur. Si elle reussit, inet_net_ntop() renvoie pres. En cas d'erreur, elle renvoie NULL et errno est defini pour indiquer l'erreur. ERREURS EAFNOSUPPORT af indique une valeur differente de AF_INET. EMSGSIZE La taille du tampon de sortie est insuffisante. ENOENT (inet_net_pton()) pres n'etait pas dans un format de presentation correct. STANDARDS Aucun. NOTES Format de presentation en entree pour inet_net_pton() L'adresse reseau peut etre indiquee sous forme de valeur hexadecimale ou de notation decimale pointee. Les valeurs hexadecimales sont indiquees en prefixant par "0x" ou "0X". Les symboles hexadecimaux remplissent les nibbles (semioctets) de l'adresse reseau de gauche a droite dans l'ordre du reseau. Dans la notation decimale pointee, jusqu'a quatre octets sont indiques sous la forme de nombres decimaux separees par des points. Ainsi, n'importe laquelle des formes suivantes est acceptee : a.b.c.d a.b.c a.b a Chaque partie est un nombre dans l'intervalle 0 a 255 remplissant un octet de l'adresse reseau, de gauche a droite, dans l'ordre des octets du reseau (gros-boutisme). Si une partie est omise, l'octet correspondant dans l'adresse reseau vaut zero. Pour la notation hexadecimale comme la notation decimale pointee, l'adresse reseau peut etre suivie d'une barre oblique et d'un nombre compris entre 0 et 32, definissant la taille de l'adresse reseau en bits. Valeur de retour de inet_net_pton() La valeur de retour de inet_net_pton() est le nombre de bits dans le champ de numero de reseau. Si la chaine de presentation se termine par une barre oblique et une valeur de taille explicite, alors cette taille devient la valeur de retour de inet_net_pton(). Sinon, la valeur de retour, bits, est supposee comme suit. - Si l'octet de poids fort de l'adresse reseau est superieur ou egal a 240, alors bits vaut 32. - Sinon, si l'octet de poids fort de l'adresse reseau est superieur ou egal a 224, alors bits vaut 4. - Sinon, si l'octet de poids fort de l'adresse reseau est superieur ou egal a 192, alors bits vaut 24. - Sinon, si l'octet de poids fort de l'adresse reseau est superieur ou egal a 128, alors bits vaut 16. - Sinon bits vaut 8. Si la valeur de bits resultant des etapes precedentes est au moins egale a 8, mais que le nombre d'octets indique dans le numero de reseau depasse bits/8, alors bits est defini a huit fois le nombre d'octets vraiment indique. EXEMPLES Le programme suivant montre l'utilisation de inet_net_pton() et inet_net_ntop(). Il utilise inet_net_pton() pour convertir une adresse reseau au format de presentation fourni en premier argument de ligne de commande vers sa forme binaire et affiche la valeur renvoyee par inet_net_pton(). Il utilise ensuite inet_net_ntop() pour reconvertir la forme binaire au format de presentation, et affiche la chaine resultante. De facon a demontrer que inet_net_pton() peut ne pas ecrire sur tous les octets de son argument netp, le programme permet un deuxieme argument de ligne de commande : un nombre utilise pour initialiser le tampon avant d'appeler inet_net_pton(). Comme en derniere ligne de sa sortie, le programme affiche tous les octets du tampon renvoye par inet_net_pton(), cela permet a l'utilisateur de voir les octets qui n'ont pas ete modifies par inet_net_pton(). Un exemple ou inet_net_pton() deduit le nombre de bits de l'adresse reseau : $ ./a.out 193.168 inet_net_pton() a renvoye : 24 inet_net_ntop() a produit : 193.168.0/24 Adresse brute : c1a80000 Demontrer que inet_net_pton() ne met pas a zero les octets inutilises du tampon de resultat : $ ./a.out 193.168 0xffffffff inet_net_pton() a renvoye : 24 inet_net_ntop() a produit : 193.168.0/24 Adresse brute : c1a800ff Demontrer que inet_net_pton() elargira la taille supposee du numero de reseau si le nombre d'octets fournis dans la chaine de presentation depasse la valeur supposee : $ ./a.out 193.168.1.128 inet_net_pton() a renvoye : 32 inet_net_ntop() a produit : 193.168.1.128/32 Adresse brute : c1a80180 Definir explicitement la taille de l'adresse reseau outrepasse toute deduction au sujet de sa taille (mais tous les octets en trop explicitement definis seront tout de meme utilises par inet_net_pton() pour remplir le tampon de resultat). $ ./a.out 193.168.1.128/24 inet_net_pton() a renvoye : 24 inet_net_ntop() a produit : 193.168.1/24 Adresse brute : c1a80180 Source du programme /* Effectuer l'edition des liens avec "-lresolv" */ #include #include #include #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \ } while (0) int main(int argc, char *argv[]) { char buf[100]; struct in_addr addr; int bits; if (argc < 2) { fprintf(stderr, "Utilisation : %s forme-presentation [val-adr-init]\n", argv[0]); exit(EXIT_FAILURE); } /* Si argv[2] est fourni (une valeur numerique), l'utiliser pour initialiser le tampon de sortie fourni a inet_net_pton(), afin de montrer que inet_net_pton() n'initialise que les octets necessaires pour stocker l'adresse reseau. Si argv[2] n'est pas fourni, alors initialiser le tampon a zero (ce qui est une bonne pratique). */ addr.s_addr = (argc > 2) ? strtod(argv[2], NULL) : 0; /* Convertir le numero de reseau sous forme de presentation argv[1] sous forme binaire. */ bits = inet_net_pton(AF_INET, argv[1], &addr, sizeof(addr)); if (bits == -1) errExit("inet_net_ntop"); printf("inet_net_pton() a renvoye : %d\n", bits); /* Reconvertir de la forme binaire au format de presentation, en utilisant << bits >> renvoye par inet_net_pton(). */ if (inet_net_ntop(AF_INET, &addr, bits, buf, sizeof(buf)) == NULL) errExit("inet_net_ntop"); printf("inet_net_ntop() a produit : %s\n", buf); /* Afficher << aqaddr >> sous forme brute (en ordre d'octets du reseau), pour permettre de voir les octets non affiches par inet_net_ntop() ; certains de ces octets pourraient ne pas avoir ete modifies par inet_net_ntop(), et avoir toujours la valeur initiale qui etait indiquee argv[2]. */ printf("Adresse brute : %x\n", htonl(addr.s_addr)); exit(EXIT_SUCCESS); } VOIR AUSSI inet(3), networks(5) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 inet_net_pton(3)