inet_pton - Convertir des adresses IPv4 et IPv6 sous forme texte en forme
binaire
Bibliothèque C standard (
libc,
-lc)
#include <arpa/inet.h>
int inet_pton(int af, const char *restrict src, void *restrict dst);
Cette fonction convertit la chaîne de caractères
src en une
structure d'adresse réseau de la famille
af, puis copie cette
structure dans
dst. L'argument
af doit être soit
AF_INET soit
AF_INET6.
dst est écrit dans l'ordre
d'octets du réseau.
Les familles d'adresses suivantes sont dès à présent
supportées :
- AF_INET
-
src pointe sur une chaîne de caractère
contenant une adresse réseau IPv4 au format décimal
pointé ddd.ddd.ddd.ddd, où ddd est un nombre
décimal, contenant jusqu'à trois chiffres, dans l'intervalle
0 à 255. L'adresse est alors convertie en une structure struct
in_addr et copiée dans dst, qui doit donc contenir au
minimum sizeof(struct in_addr) (4) octets (32 bits).
- AF_INET6
-
src pointe sur une chaîne de
caractères contenant une adresse réseau IPv6. L'adresse est
convertie en une structure struct in6_addr et copiée dans
dst, qui doit donc contenir au moins sizeof(struct in6_addr)
(16) octets (128 bits). Les formats d'adresse IPv6 autorisés
suivent les règles suivantes :
- •
- Le format préféré est
x:x:x:x:x:x:x:x. Cette forme consiste en 8 nombres
hexadécimaux, chacun d'entre eux exprimant une valeur sur
16 bits (c'est-à-dire que chaque x peut contenir
jusqu'à 4 symboles hexadécimaux).
- •
- Une série de zéros contigus dans la forme
préférée peut être abrégée en
::. Une seule instance de :: peut apparaître dans une
adresse. Par exemple, l'adresse de boucle 0:0:0:0:0:0:0:1 peut
être abrégée en ::1. L'adresse joker,
constituée uniquement de zéros, peut être
écrite comme ::.
- •
- Un autre format utile pour exprimer des adresses IPv4
projetées dans l'espace IPv6 est x:x:x:x:x:x:d.d.d.d,
où les six x de tête sont des valeurs
hexadécimales qui définissent les 6 mots 16 bits de
poids fort de l'adresse (c'est-à-dire 96 bits), et les
d expriment une valeur en notation décimale pointée
définissant les 32 bits de poids faible de l'adresse. Un
exemple d'une telle adresse est ::FFFF:204.152.189.116.
- Consultez la RFC 2373 pour plus de détails
sur la représentation des adresses IPv6.
inet_pton() renvoie 1 si elle réussit (l'adresse réseau a
été convertie avec succès). Elle renvoie une valeur nulle
si
src ne contient pas une adresse réseau valable pour la
famille indiquée. Si
af ne contient pas de famille d'adresse
valable, -1 est renvoyé et
errno contient
EAFNOSUPPORT.
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
inet_pton(). |
Sécurité des threads |
MT-Safe locale |
POSIX.1-2001, POSIX.1-2008.
Contrairement à
inet_aton(3) et
inet_addr(3),
inet_pton() gère les adresses IPv6. D'un autre coté,
inet_pton() n'accepte que les adresses IPv4 en notation décimale
pointée alors que
inet_aton(3) et
inet_addr(3) autorisent
la notation plus générale numérique pointée
(formats à nombre hexadécimaux et octaux, de même que les
formats n'exigeant pas que les 4 octets soient explicitement écrits).
Pour une interface gérant les adresses IPv6 et IPv4 en notation
numérique pointée, consultez
getaddrinfo(3).
AF_INET6 ne reconnaît pas les adresses IPv4. Il faut dans ce cas
fournir dans
src une adresse IPv4 projetée dans l'espace IPv6.
Le programme suivant montre une utilisation de
inet_pton() et
inet_ntop(3). Voici quelques exemples d'exécution :
$ ./a.out i6 0:0:0:0:0:0:0:0
::
$ ./a.out i6 1:0:0:0:0:0:0:8
1::8
$ ./a.out i6 0:0:0:0:0:FFFF:204.152.189.116
::ffff:204.152.189.116
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(int argc, char *argv[])
{
unsigned char buf[sizeof(struct in6_addr)];
int domain, s;
char str[INET6_ADDRSTRLEN];
if (argc != 3) {
fprintf(stderr, "Usage: %s {i4|i6|<num>} string\n", argv[0]);
exit(EXIT_FAILURE);
}
domain = (strcmp(argv[1], "i4") == 0) ? AF_INET :
(strcmp(argv[1], "i6") == 0) ? AF_INET6 : atoi(argv[1]);
s = inet_pton(domain, argv[2], buf);
if (s <= 0) {
if (s == 0)
fprintf(stderr, "Not in presentation format");
else
perror("inet_pton");
exit(EXIT_FAILURE);
}
if (inet_ntop(domain, buf, str, INET6_ADDRSTRLEN) == NULL) {
perror("inet_ntop");
exit(EXIT_FAILURE);
}
printf("%s\n", str);
exit(EXIT_SUCCESS);
}
getaddrinfo(3),
inet(3),
inet_ntop(3)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]> et David Prévot <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]