2010-01-04 151 views
1

嘿,所有。我已經編寫了一個程序,可以順序掃描局域網中某些部分的計算機(將提供代碼)。但是,當我運行此代碼時,它只會返回正在運行的計算機的DNS主機名。我研究過使用WMI,但是我不能,因爲我不會總是對被發現的計算機有好感。有沒有其他方法可以找到本地計算機HostName?從局域網中的IP地址查找DNS主機名

using System; 
using System.Net; 
using System.Net.NetworkInformation; 
using System.Text; 

namespace CheckLocalNetwork 
{ 
    class PingCheck 
    { 
     public static string fullip; 

     public void CheckSequentialIP() 
     { 
      IPHostEntry IpEntry = Dns.GetHostEntry(fullip); 

      Ping pingSender = new Ping(); 

      PingOptions options = new PingOptions(); 
      options.DontFragment = true; 

      string data = "a"; 
      byte[] buffer = Encoding.ASCII.GetBytes(data); 
      int timeout = 120; 
      PingReply reply = pingSender.Send(fullip, timeout, buffer, options); 

      if (reply.Status == IPStatus.Success) 
      { 
       Console.WriteLine("Address: {0}", reply.Address.ToString()); 
       Console.WriteLine("Host Name: {0}", IpEntry.HostName); 
       Console.WriteLine("RoundTrip time: {0}", reply.RoundtripTime); 
       Console.WriteLine("Time to live: {0}", reply.Options.Ttl); 
       Console.WriteLine("Don't fragment: {0}", reply.Options.DontFragment); 
       Console.WriteLine("Buffer size: {0}", reply.Buffer.Length); 
       Console.WriteLine(""); 
      } 
     } 

     static void Main(string[] args) 
     { 
      Console.WriteLine("Press enter to search for ip adresses that begin with 192.168.1"); 
      Console.ReadLine(); 

      for (int endofip = 1; endofip < 101; endofip++) 
      { 
       fullip = "192.168.1." + Convert.ToString(endofip); 
       PingCheck checkfullip = new PingCheck(); 
       checkfullip.CheckSequentialIP(); 

      } 
      Console.ReadLine(); 
    } 

非常感謝所有幫助。

回答

2

嗯 - 您的代碼示例在我的機器上的行爲與預期相同 - 即它返回正在掃描的計算機的主機名。

爲了深入調查你的問題,你有沒有嘗試過使用nslookup來檢查IP地址的解析?

Microsoft Windows [Version 6.1.7600] 
Copyright (c) 2009 Microsoft Corporation. All rights reserved. 

C:\Users\Rob>nslookup     <-- type this at a command prompt 
Default Server: mydns.mydomain.co.uk <--- these two lines indicate the dns server being used to resolve your queries 
Address: 192.168.0.1     <----| 

> 192.168.0.5       <---- type in the ip address of one of the machines in question 
Server: mydns.mydomain.co.uk 
Address: 192.168.0.1 

Name: myworkstation.mydomain.co.uk <---- this is the hostname, as reported by the DNS using a reverse lookup 
Address: 192.168.0.5 

如果這沒有返回機器名稱,那麼您可能會遇到與您的代碼無關的名稱解析問題。

如果這一切看起來不錯,那麼它也可能值得列舉IpEntry.Aliases集合。這裏有沒有條目,它們有意義嗎?

最後 - 你上面的代碼是否正確的代碼會出錯,或者它是一個「蒸餾」的例子?我想問的原因是,Dns.GetHostEntry狀態

的文檔「當一個空字符串作爲 主機名過去了,這個方法返回本地主機的 IPv4地址。」

我還注意到你在靜態持有「fullip」。如果這不是導致問題的確切代碼,那麼尤其是在運行多線程時,是否有機會在調用Dns.GetHostEntry之前未初始化「fullip」?

我可能是路要走,但我的想法是值得給予什麼發生在我一個傾吐心事,我看着你的問題:)

[編輯:] - 以KDT您的評論已澄清我誤解了一些東西。我想想到你說你總是找回你本地機器的主機名,不管你「掃描」了哪臺機器 - 這是非常奇怪的行爲。事實上,我認爲你只是說你只需獲取其他機器的IP地址(他們的IP地址),並且只能獲得本地的主機名。無視我最後一點關於穿線和空洞的論點。

這很容易解釋 - 你的機器幾乎肯定不能解決機器名稱 - 我希望我建議的nslookup測試也不會返回機器名稱。

爲了將這些IP解析爲主機名,您的計算機需要一個DNS,這些DNS具有這些機器的條目,或者將它們放在其本地主機文件中;你的機器實際上並不是要求這個遠程機器的名字,所以當你進行這個調用時,它無法在沒有其常用名稱解析路徑的幫助下找到它。

它適用於我,因爲我的本地DNS確實具有我網絡上所有機器的條目,將它們的主機名解析爲IP地址,反之亦然。

+0

當你編輯出現時,我正在寫另一個「不那麼」的評論。你說得對,nslookup沒有返回任何對運行我的程序時出現的其他地址有用的東西。這是整個計劃。建議一個正確的問題來解決這個問題,然後呢?在不使用WMI的情況下獲取DNS主機名的一個可靠方法就是這裏需要的,它仍然聽起來像。 – Bloodyaugust 2010-01-04 23:35:32

+0

這裏的問題並不是真正的代碼相關 - 它與你的網絡設置有關。基本上,如果網絡上的一臺機器想要另一臺機器的主機名,只給出它的IP地址,它只有幾個選擇。 1)查看本地主機文件中是否存在映射 - 對您的情況沒有幫助。 2)詢問一個DNS。除了一些傳統的NetBIOS方法,這就是你所擁有的。 WMI也無濟於事。 這實際上是一個系統管理員問題 - 您的DNS服務器應該有這些機器的條目。如果沒有我的頭腦,我真的無法想到一個解決方案。 – 2010-01-04 23:43:01

+0

非常感謝您的幫助。 – Bloodyaugust 2010-01-04 23:46:14