0

问题:应用程序中有一个输入字段,用户可以在其中输入主机名或 IP 地址。我需要判断输入的地址是否对应于真实主机。

我不是在谈论简单的正则表达式检查或 IPAddress.TryParse 或 Uri.CheckHostName。检查主机名没有困难:如果无法解析为 IP 地址,则 Dns.GetHostEntry 将引发异常。那是小菜一碟。

然而。如果我得到一个 IP 地址输入,那么如果我进行 Dns.GetHostAddresses 调用它总是会成功,即使我输入一个愚蠢的 IP,比如“1.1.1.1”(“1.1.1.1”是 IANA 保留的 IP 地址,我们的 DNS 服务器报告“不存在的主机/域”)。Dns.GetHostAddresses 立即吐出我刚刚传入的 IP,就好像一切都会好起来一样。

我也不能使用 Dns.GetHostEntry,因为有一些 IP 地址(比如我在本地网络上的虚拟机)没有任何与它们关联的 DNS 主机名,但它们仍然有有效的 IP 地址,并且 Dns.GetHostEntry会向那些抛出异常(我猜它会尝试为他们解析主机名?)。

我需要一个方法调用,它实际上告诉我它是否是虚假 IP,即使它看起来像好的 IP 地址(通过 Uri.CheckHostName),但它没有相应的 DNS 主机名。

4

1 回答 1

2

您可以进行的唯一合理检查是 IP 是否是某种保留 IP。否则,您无能为力——即使缺少“ping”(ICMP)响应和知名端口(如 HTTP - 80)上的响应也没有任何意义。

保留如下:

  • 127.0.0.0/8 - 环回(可能会或可能不会被视为“有效主机”)
  • 224.0.0.0 - 239.255.255.255 - 多播(不太可能被视为“有效主机”)
  • 子网中的全零/全一(即 192.168.1.0 和 192.168.1.255 用于 192.168.1.0/24 子网)全部/广播 - 显然与特定方式无关。

检查IP4 子网划分和链接的 RFC 以获取有关特殊范围/IP 的更多信息。

于 2013-03-20T21:20:18.390 回答