以下计划及其输出显示INET_ADDRSTRLEN
定义为16
,INET_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地址的字符串表示形式?
答案 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
了解更多: