从LAN中的IP地址查找DNS HostName

时间:2010-01-04 23:03:21

标签: c# .net network-programming dns lan

嘿所有人。我编写了一个程序,可以顺序扫描局域网的某些部分以供计算机使用(将提供代码)。但是,当我运行此代码时,它只返回正在运行的计算机的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();
    }

非常感谢所有帮助。

1 个答案:

答案 0 :(得分: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确实有我网络上所有机器的条目,将其主机名解析为IP地址,反之亦然。