这个问题让我的一个朋友很头疼,因为他在设置交换式互联网连接时,配置文件中的 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 上也会发生相同的行为。
如果指定的地址系列是 AF_INET 或 AF_UNSPEC,则使用 Internet 标准点表示法指定的地址字符串
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