1. ホーム
  2. c

[解決済み] C言語ではINET6_ADDRSTRLENはなぜ46と定義されているのですか?

2022-02-07 17:12:58

質問

次のプログラムとその出力は、次のことを示しています。 INET_ADDRSTRLEN は次のように定義されます。 16INET6_ADDRSTRLEN は次のように定義されます。 46 .

以下はそのプログラムです。

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

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

以下はその出力です。

16
46

の理由は理解できる。 INET_ADDRSTRLEN にする必要があります。 16 . IPv4アドレスの最大文字列表現は、15バイトを消費します。 "255.255.255.255" . したがって、このようなIPアドレスとその末尾のヌル文字を格納するには、16バイトが必要です。

しかし、なぜ INET6_ADDRSTRLEN である必要があります。 46 ? IPv6アドレスの最大可能文字列表現は、39バイトしか消費しません(私の知る限りでは)。 "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" . したがって、このようなIPアドレスとその末尾のヌル文字を格納するのに必要なバイト数は、わずか40バイトです。

46バイトを消費するIPv6アドレスの文字列表現はあるのでしょうか?

どのように解決するのですか?

<ブロッククオート

なぜC言語ではINET6_ADDRSTRLENが46と定義されているのですか?

なぜなら POSIX は46と定義しています。

inet6_addrstrlen
46. IPv6用の文字列フォームの長さ。

IPv6アドレスの最長形式が39バイトであることはその通りですが、IPv4トンネリングでは最長形式が45バイトになることがあります。

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

そして46バイト目は、終端のヌルバイト(C言語では文字列)用です。これで46になった経緯がわかります。