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

Lon*_*ner 17 c sockets ipv6

以下程序及其输出显示INET_ADDRSTRLEN定义为16INET_ADDRSTRLEN定义为46.

这是程序.

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

int main()
{
    printf("%d\n", INET_ADDRSTRLEN);
    printf("%d\n", INET6_ADDRSTRLEN);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是输出.

16
46
Run Code Online (Sandbox Code Playgroud)

我能理解为什么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地址的字符串表示形式?

usr*_*usr 34

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

因为POSIX将其定义为46:

INET6_ADDRSTRLEN
46. IPv6的字符串形式的长度.

虽然你说得对,最长的IPv6地址占用39个字节,但使用IPv4隧道,最长的形式可以是45个字节:

ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255
Run Code Online (Sandbox Code Playgroud)

第46个字节用于终止nul字节(在C字符串中).这解释了它是如何成为46的.


e.d*_*dan 5

可能是IPv4映射形式的地址:

ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255
Run Code Online (Sandbox Code Playgroud)

阅读更多:

Wireshark-dev邮件列表

RFC 4291第2.2节