为什么 MacOSX 尝试将零填充的 IP 地址解析为主机名?

为什么 MacOSX 尝试将零填充的 IP 地址解析为主机名?

这个问题让我的一个朋友很头疼,因为他在设置交换式互联网连接时,配置文件中的 IP 地址为零,如下所示:

192.168.019.254

无论他如何尝试配置 Mac 网络堆栈,它就是不起作用。但 GUI 也没有抱怨错误。

后来我发现,在终端中 ping 这些用零填充的地址时会显示“无法解析”,而 ping 相同地址时不填充零(192.168.19.254与 相比192.168.019.254)时会显示“无法到达”,这让这个谜团大为解开。删除无用的零后,一切正常。

这是错误还是功能?我以前从未遇到过如此奇怪的行为 - 无论我使用 GUI 还是 CLI 来配置或测试 IP 内容。

答案1

从字符串到地址的转换通常由 POSIX 函数执行getaddrinfo()。此函数首先使用以下方法检查数字 IP 地址inet_addr(),如果失败,它将尝试将字符串解析为域名。 inet_addr()将以 0 开头的数字解释为八进制,因此例如010将变为8,并且019将出现错误(因此将解析为域名)。Linux 和 Solaris 上也会发生相同的行为。

getaddrinfo()

如果指定的地址系列是 AF_INET 或 AF_UNSPEC,则使用 Internet 标准点表示法指定的地址字符串inet_addr()有效。

inet_addr()

按照 ISO C 标准所规定,以 IPv4 点分十进制表示法提供的所有数字都可以是十进制、八进制或十六进制(即,前导 0x 或 0X 表示十六进制;否则,前导“0”表示八进制;否则,该数字将被解释为十进制)。

请注意括号中的地址 192.168.8.254:

$ ping 192.168.010.254
PING 192.168.010.254 (192.168.8.254): 56 data bytes
Request timeout for icmp_seq 0

相关内容