次のプログラムとその出力は、INET_ADDRSTRLEN
が16
として定義され、INET6_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番目のバイトは終端のnulバイト(Cでは文字列)です。これは、46になった理由を説明しています。
それはおそらく次の形式のアドレスのIPv4マップ形式用です:
ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255
続きを読む: