web-dev-qa-db-fra.com

Pourquoi INET6_ADDRSTRLEN est défini comme 46 dans C?

Le programme suivant et sa sortie montrent que INET_ADDRSTRLEN est défini comme 16 et INET6_ADDRSTRLEN est défini comme 46.

Voici le programme.

#include <stdio.h>
#include <arpa/inet.h>

int main()
{
    printf("%d\n", INET_ADDRSTRLEN);
    printf("%d\n", INET6_ADDRSTRLEN);
    return 0;
}

Voici la sortie.

16
46

Je peux comprendre pourquoi INET_ADDRSTRLEN doit être 16. La plus grande représentation de chaîne possible d'une adresse IPv4 consomme 15 octets, par ex. "255.255.255.255". Par conséquent, 16 octets sont nécessaires pour stocker une telle adresse IP avec son caractère nul final.

Mais pourquoi INET6_ADDRSTRLEN besoin d'être 46? La plus grande représentation de chaîne possible d'une adresse IPv6 ne consomme que 39 octets (à ma connaissance), par ex. "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff". Par conséquent, seuls 40 octets sont nécessaires pour stocker une telle adresse IP avec son caractère nul final.

Existe-t-il une représentation sous forme de chaîne d'une adresse IPv6 pouvant consommer 46 octets?

17
Lone Learner

Pourquoi INET6_ADDRSTRLEN est défini comme 46 dans C?

Parce que POSIX le définit comme étant 46:

INET6_ADDRSTRLEN
46. Longueur de la chaîne sous IPv6.

Bien que vous ayez raison de dire que l'adresse IPv6 la plus longue prend 39 octets, avec le tunnelage IPv4, la forme la plus longue peut être de 45 octets:

ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255

Et le 46e octet est pour l'octet nul final (en C une chaîne). Cela explique comment il est arrivé à 46 ans.

36
usr

C'est probablement pour la forme d'adresses mappées IPv4 du formulaire:

ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255

Lire la suite:

liste de diffusion Wireshark-dev

RFC 4291 section 2.2

6
e.dan