十进制是一种事实上的标准;IPv4地址的字符串格式化从未得到适当的标准化。几乎所有工具都只接受十进制、点分十进制表示法,但这并不普遍适用;任何仍使用常见实现的inet_aton()
函数的工具可能会处理替代格式。
iputils
包中包含的ping
命令是一个有用的示例。尝试使用谷歌的一个地址,分别使用十进制、十六进制和八进制点分十进制:
ping -c1 216.58.195.238
ping -c1 0xd8.0x3a.0xc3.0xee
ping -c1 0330.072.0303.0356
这些都会ping同一个地址,因为它们都代表相同的32位。
但它不仅如此。你并不一定要使用四个八位字节;在无类别地址和可变长度子网掩码的日子里,分类寻址曾经指定了8位、16位和24位网络前缀。其中一些仍然被编入了inet_aton()
:
上面的地址,格式化为8/8/16位:
ping -c1 216.58.50158
ping -c1 0330.072.0141756
ping -c1 0xd8.0x3a.0xc3ee
或者,以8/24位格式呈现:
ping -c1 216.3851246
ping -c1 0330.016541756
ping -c1 0xd8.0x3ac3ee
或者,不用点号,直接输入32位二进制数:
ping -c1 3627729902
ping -c1 033016541756
ping -c1 0xd83ac3ee
但更好的是,您不必以相同格式提交每个块:
ping -c1 0xd8.072.195.0xee
这一切都提醒我们,
inet_aton()
是一个非常老的函数,它不理解IPv6地址。如果你今天编写代码,你不会想使用
inet_aton()
,而是想用
inet_pton()
,它可以处理两种类型的地址。我用过的
inet_pton()
实现更忠实地遵循十进制点分表示法的事实标准IPv4地址表示。对于IPv6,它确实有关于字符串表示的
RFC标准,
inet_pton()
也会遵循这些标准!
inet_aton()
不在POSIX标准中,但通常由C库实现;我恐怕没有进行过任何重要的Windows网络编程,无法确定,但文档似乎表明他们没有实现inet_aton()
。他们建议使用inet_pton()
,无论如何都更受推荐。 - undefined