C#确定IP地址是否代表真实主机

时间:2013-03-20 20:43:44

标签: c# ip-address verification hostname

问题:应用程序中有一个输入字段,用户可以在其中输入主机名或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主机名。

1 个答案:

答案 0 :(得分:2)

唯一合理的检查是IP是某种保留IP。否则,你无能为力 - 即使缺乏“ping”(ICMP)响应,并且在众所周知的端口(如HTTP-80)上缺乏响应也没有任何意义。

保留,如:

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

检查IP4 subnetting和链接的RFC,了解有关特殊范围/ IP的更多信息。