为什么在C语言中INET6_ADDRSTRLEN被定义为46?

33
下面的程序及其输出表明,INET_ADDRSTRLEN被定义为16,而INET6_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个字节来存储带有终止空字符的IPv6地址。

是否存在一个IPv6地址的字符串表示可以占用46个字节?


FYI:对于Windows编程,当您#include <winsock2.h>时,值的#define方式不同:在wsipdef.h中,INET_ADDRSTRLEN为22,INET6_ADDRSTRLEN为65。这适用于IPv6地址周围带有范围ID、冒号和端口号的可选括号。例如:[ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255%2147483648]:65535长度为64个字符,需要65个字符的缓冲区。 - Jac Goudsmit
2个回答

66
为什么C语言中INET6_ADDRSTRLEN被定义为46?
因为POSIX规定其为46:
INET6_ADDRSTRLEN 46。IPv6地址字符串形式的长度。
虽然你是对的,最长的IPv6地址占用39字节,但是通过IPv4隧道传输,最长的形式可以达到45字节:
ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255

第46个字节是用于终止空字符(在C语言中表示字符串)。这就解释了为什么它是46。


10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接