为什么 INET6_ADDRSTRLEN 在 C 中定义为 46?
Why is INET6_ADDRSTRLEN defined as 46 in C?
以下程序及其输出显示 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"
。因此需要 16 个字节来存储这样一个带有终止空字符的 IP 地址。
但为什么 INET6_ADDRSTRLEN
需要 46
? IPv6 地址的最大可能字符串表示仅消耗 39 个字节(据我所知),例如"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"
。因此只需要 40 个字节来存储这样一个带有终止空字符的 IP 地址。
是否有可以占用 46 个字节的 IPv6 地址的字符串表示形式?
它可能适用于以下形式的 IPv4 映射地址形式:
ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255
阅读更多:
Why is INET6_ADDRSTRLEN defined as 46 in C?
因为POSIX定义为46:
INET6_ADDRSTRLEN
46. Length of the string form for IPv6.
虽然你说得对,最长的 IPv6 地址需要 39 个字节,但使用 IPv4 隧道,最长的形式可以是 45 个字节:
ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255
而第 46 个字节用于终止 nul 字节(在 C 中为字符串)。这解释了它是如何变成 46 的。
以下程序及其输出显示 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"
。因此需要 16 个字节来存储这样一个带有终止空字符的 IP 地址。
但为什么 INET6_ADDRSTRLEN
需要 46
? IPv6 地址的最大可能字符串表示仅消耗 39 个字节(据我所知),例如"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"
。因此只需要 40 个字节来存储这样一个带有终止空字符的 IP 地址。
是否有可以占用 46 个字节的 IPv6 地址的字符串表示形式?
它可能适用于以下形式的 IPv4 映射地址形式:
ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255
阅读更多:
Why is INET6_ADDRSTRLEN defined as 46 in C?
因为POSIX定义为46:
INET6_ADDRSTRLEN
46. Length of the string form for IPv6.
虽然你说得对,最长的 IPv6 地址需要 39 个字节,但使用 IPv4 隧道,最长的形式可以是 45 个字节:
ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255
而第 46 个字节用于终止 nul 字节(在 C 中为字符串)。这解释了它是如何变成 46 的。