web-dev-qa-db-ja.com

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

次のプログラムとその出力は、INET_ADDRSTRLEN16として定義され、INET6_ADDRSTRLEN46として定義されていることを示しています。

こちらがプログラムです。

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

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

これが出力です。

16
46

INET_ADDRSTRLEN16にする必要がある理由を理解できます。 IPv4アドレスの可能な最大の文字列表現は15バイトを消費します。 "255.255.255.255"。したがって、終端のヌル文字を含むそのようなIPアドレスを格納するには、16バイトが必要です。

しかし、なぜINET6_ADDRSTRLEN46にする必要があるのでしょうか。 IPv6アドレスの可能な最大の文字列表現は、39バイトのみを消費します(私の知識によると)。 "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"。したがって、終端のヌル文字を含むそのようなIPアドレスを格納するには、40バイトしか必要ありません。

46バイトを消費する可能性のあるIPv6アドレスの文字列表現はありますか?

17
Lone Learner

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番目のバイトは終端のnulバイト(Cでは文字列)です。これは、46になった理由を説明しています。

36
usr

それはおそらく次の形式のアドレスのIPv4マップ形式用です:

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

続きを読む:

Wireshark-devメーリングリスト

RFC 4291セクション2.2

6
e.dan