以下程序及其输出显示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;
}
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的.
可能是IPv4映射形式的地址:
ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255
Run Code Online (Sandbox Code Playgroud)
阅读更多: