Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#确定IP地址是否代表真实主机_C#_Ip Address_Verification_Hostname - Fatal编程技术网

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

C#确定IP地址是否代表真实主机,c#,ip-address,verification,hostname,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”

问题:应用程序中有一个输入字段,用户可以在其中输入主机名或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-多播(不太可能被视为“有效主机”)
  • 子网中的所有零/所有一(即192.168.1.0和192.168.1.255,用于192.168.1.0/24子网)均为全/广播-显然与特定方式无关

有关特殊范围/IP的更多信息,请查看并链接RFC。

什么是“真正的主机”?如果将Dns.GetHostEntry与域名一起使用,则只会发现Dns中是否有该名称的条目,而不会发现其背后实际上有一台计算机。您可以向IP地址发送ICMP回显请求(“ping”),但如果您没有收到响应,并不意味着没有计算机。您看过或吗?他们都使用Dns.GetHostByName。我同意dtb,我只是ping一下。我不确定你是否有防止这种情况发生的要求。你的要求似乎不合理。主机名和IP地址解析由域名系统执行。如果DNS服务器没有正确实施反向查找,或者存在它不知道的IP地址,则结果将不完整。dtb:“真实主机”=计算机/虚拟机后面的主机名或IP地址。如果只有一个IP,那么DNS作为一个系统无法解决我的问题。同时,也许我可以查看ARP表,如果IP在本地子网上,我可以看到它。但我不喜欢ARP是一种较低级别的方法。我在想…是的,不幸的是,即使主机没有响应ICMP回送请求,IP仍然可以是有效的。我应该一起编译一个有效IP地址列表吗?十多年前,当我编写一个真正伟大(偏执)的ipchains防火墙脚本(Linux早期)时,保留+特殊用途IP地址的列表相当长。IPv4地址空间的耗尽似乎释放了很多这样的空间!看看RFC 5735和RFC 3330。我想知道目前的确切清单是什么。但也许我不该那么在意。一旦我知道主机上有趣的端口号,我就可以尝试实际打开它