从LAN中的IP地址查找DNS主机名

大家好。 我编写了一个程序,可以顺序扫描局域网的某些部分以供计算机使用(将提供代码)。 但是,当我运行此代码时,它只返回正在运行的计算机的DNS HostName。 我研究过使用WMI,但我不能,因为我不会总是对所找到的计算机有所了解。 有没有其他方法可以找到本地计算机HostName?

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(); } 

非常感谢所有帮助。

嗯 – 您的代码示例在我的机器上按预期运行 – 即它返回正在扫描的机器的主机名。

为了更深入地调查您的问题,您是否尝试过使用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 ,那么也可能值得枚举IpEntry.Aliases集合。 这里有条目吗,它们有意义吗?

最后 - 你上面的代码是你错误的代码,还是一个“蒸馏”的例子? 我问的原因是Dns.GetHostEntry的文档说明

“当一个空字符串作为主机名传递时,此方法返回本地主机的IPv4地址。”

我也注意到你在静态中持有“fullip”。 如果这不是导致问题的确切代码, 特别是如果它运行multithreading ,是否有可能在调用Dns.GetHostEntry之前没有初始化“fullip”?

我可能会离开,但我认为当我看着你的问题时,我觉得值得给我一个脑袋转储:)

[ 编辑: ] - 你对kdt的评论澄清了一些我误解的东西。 我以为你说你总是拿回你本地机器的主机名,无论你“扫描”哪台机器 - 这是非常奇怪的行为。 事实上,我认为你说你只需要获取其他机器的IP地址(它们的IP地址),并且只获取本地的主机名。 忽略我关于线程和空参数的最后一点。

这更容易解释 - 您的机器几乎肯定无法解析机器名称 - 我希望我建议的nslookup测试也不会返回机器名称。

为了将这些IP解析为主机名,您的计算机需要一个具有这些计算机条目的DNS,或者将它们放在本地主机文件中; 当你做这个电话时,你的机器实际上并没有要求远程机器输入它的名字,所以它赢了;在没有其常用名称解析路径帮助的情况下能够找到它。

它适用于我,因为我的本地DNS确实有我的网络上的所有机器的条目,将其主机名解析为IP地址,反之亦然。