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

hur*_*n77 4 mac ip-address tcpip macos

这个问题让一位朋友在设置交换式互联网连接时有些头疼,该连接在配置文件中填充了零的 IP 地址,如下所示:

192.168.019.254

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

我后来发现在终端中 ping 这些零填充地址显示“无法解析”,而在没有填充零的情况下 ping 同一个地址(192.168.19.254vs. 192.168.019.254)显示“无法到达”,这给这个谜团带来了很多光明。删除无用的零使一切正常。

这是错误还是功能?我以前从未经历过这种奇怪的行为——无论我是使用 GUI 还是 CLI 来配置或测试 IP 内容。

mar*_*k4o 10

从字符串到地址的转换通常由 POSIX 函数执行getaddrinfo()。此函数首先使用 来检查数字 IP 地址inet_addr(),如果失败,它将尝试将该字符串解析为域名。 inet_addr()将带有前导 0 的数字解释为八进制,因此例如010将变为8,并且019将是一个错误(因此将被解析为域名)。同样的行为也发生在 Linux 和 Solaris 上。

来自getaddrinfo()

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

来自inet_addr()

在 IPv4 点分十进制表示法中作为部分提供的所有数字可以是 ISO C 标准中指定的十进制、八进制或十六进制(即,前导 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
Run Code Online (Sandbox Code Playgroud)

  • 它让我一闪而过:说到八进制数,我记得有问题的原始 IP 类似于 xxx.xxx.019.xxx - 这当然不是有效数字,因此是无效的主机名。修正我的问题... (3认同)

归档时间:

查看次数:

449 次

最近记录:

12 年 前