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

时间:2016-09-12 04:34:50

标签: 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;
}

这是输出。

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地址的字符串表示形式?

2 个答案:

答案 0 :(得分:32)

  

为什么INET6_ADDRSTRLEN在C中定义为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的。

答案 1 :(得分:5)

可能是IPv4格式的地址形式:

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

了解更多:

Wireshark-dev mailing list

RFC 4291 section 2.2