2016-09-12 57 views
7

Poniższy program i jego dane wyjściowe pokazują, że INET_ADDRSTRLEN jest zdefiniowany jako 16, a INET_ADDRSTRLEN jest zdefiniowany jako 46.Dlaczego INET6_ADDRSTRLEN zdefiniowano jako 46 w C?

Oto program.

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

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

Tutaj jest wyjście.

16 
46 

mogę zrozumieć dlaczego INET_ADDRSTRLEN musi być 16. Największa możliwa reprezentacja ciągów adresu IPv4 pochłania 15 bajtów, np. "255.255.255.255". Dlatego 16 bajtów jest wymaganych do zapisania takiego adresu IP z jego końcowym znakiem pustym.

Ale dlaczego INET6_ADDRSTRLEN musi być 46? Największa możliwa reprezentacja ciągów adresu IPv6 pochłania tylko 39 bajtów (zgodnie z moją wiedzą), np. "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff". Dlatego wymagane jest tylko 40 bajtów do przechowywania takiego adresu IP z jego końcowym znakiem pustym.

Czy istnieje ciąg znaków reprezentujący adres IPv6, który może pochłonąć 46 bajtów?

+0

Powiązane: [Maksymalna długość tekstowej reprezentacji adresu IPv6?] (Http://stackoverflow.com/q/166132/1068283) –

Odpowiedz

19

Dlaczego INET6_ADDRSTRLEN definiowana jako 46 w C?

Ponieważ POSIX definiuje się 46:

INET6_ADDRSTRLEN
46. Długość postaci łańcucha IPv6.

Choć masz rację, że longtest adres IPv6 zajmuje 39 bajtów, z IPv4, najdłuższa forma może być 45 bajtów:

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

I 46. bajt jest bajt kończący nul (w C ciąg). Wyjaśnia, jak to było 46.