c#判断一个IP地址是否代表一个真实的主机
本文关键字:一个 真实 主机 IP 判断 地址 是否 | 更新日期: 2023-09-27 18:04:52
问题:应用程序中有一个输入字段,用户可以在其中输入主机名或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主机名。
您可以做的唯一合理的检查是IP是否是某种保留IP。否则你就无能为力了——即使没有"ping"(ICMP)响应和在众所周知的端口(如HTTP - 80)上没有响应也没有任何意义。
保留,如:
- 127.0.0.0/8 -环回(可能或可能不被视为"有效主机")
- 224.0.0.0 - 239.255.255.255 -多播(不太可能被视为"有效主机")
- 子网中的所有0/1(即192.168.1.0/24子网中的192.168.1.0和192.168.1.255)都是/广播的-显然与特定的方式无关。
查看IP4子网划分和链接的rfc以获取有关特殊范围/ip的更多信息。