2013-03-20 82 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