2013-03-20 81 views
0

问题:应用程序中有一个输入字段,用户可以输入主机名或IP地址。我需要告诉输入的地址是否对应一个真实的主机。C#确定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

什么是“真正的主机”?如果您使用带有域名的Dns.GetHostEntry,则只会发现DNS名称中是否存在条目,而不是其后面是否有计算机。您可以发送一个ICMP回应请求(“ping”)到IP地址,但是如果您没有得到回应,这并不意味着没有电脑。 – dtb 2013-03-20 20:49:01

+0

你看过http://www.codeproject.com/Articles/12072/C-NET-DNS-query-component或http://www.aspnettutorials.com/tutorials/network/net-dns-aspnet2-csharp .aspx?他们都使用Dns.GetHostByName。 – RandomUs1r 2013-03-20 20:52:00

+0

和我同意dtb,我只是平了它。我不确定你是否有能够防止这种情况的要求。 – RandomUs1r 2013-03-20 20:52:47

回答

2

如果IP是某种保留的IP,唯一合理的检查方式是可以进行的。否则,你可以做的事情就不多了 - 即使缺乏“ping”(ICMP)响应以及缺乏知名端口(如HTTP-80)的响应也没有任何意义。

保留如:

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

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

+0

是的,不幸的是即使主机不响应ICMP回应请求,IP仍然是有效的。我应该一起编译一个有效的IP地址列表吗? 10多年前,当我写了一个真正伟大的(偏执)ipchains防火墙脚本(早期的Linux年)时,保留的+特殊用途IP地址列表非常长。 IPv4地址空间的耗尽似乎让这些空间大大减少!看看RFC 5735 vs RFC 3330.我想知道什么是当前的确切列表。但也许我不应该在乎那么多。一旦我知道主机上有趣的端口号,我可以尝试实际打开它 – 2013-03-24 03:20:57