2010-01-04 153 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