为什么 INET6_ADDRSTRLEN 在 C 中定义为 46?

Why is INET6_ADDRSTRLEN defined as 46 in C?

以下程序及其输出显示 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"。因此需要 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

阅读更多:

Wireshark-dev mailing list

RFC 4291 section 2.2

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 的。