【问题标题】:Find DNS HostName from IP Address in LAN从局域网中的 IP 地址查找 DNS 主机名
【发布时间】:2010-01-04 23:03:21
【问题描述】:

大家好。我编写了一个程序,可以顺序扫描 LAN 的某些部分以查找计算机(将提供代码)。但是,当我运行此代码时,它只返回运行它的计算机的 DNS 主机名。我研究过使用 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();
    }

非常感谢所有帮助。

【问题讨论】:

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


    【解决方案1】:

    嗯 - 您的代码示例在我的机器上的行为符合预期 - 即它返回被扫描机器的主机名。

    为了更深入地调查您的问题,您是否尝试过使用 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 地址。”

    我还注意到您在静态中持有“fulllip”。如果这不是导致问题的确切代码,尤其是如果它运行多线程,是否有可能在调用 Dns.GetHostEntry 之前没有初始化“fulllip”?

    我可能还差得很远,但我认为值得对我看到您的问题时发生的事情进行脑筋急转弯 :)

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

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

    为了将这些 IP 解析为主机名,您的机器需要一个包含这些机器条目的 DNS,或者将它们放在其本地主机文件中;当您执行此调用时,您的机器实际上并没有询问远程机器的名称,因此它无法在没有其常用名称解析路径之一的帮助的情况下找到它。

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

    【讨论】:

    • 当您的编辑出现时,我正在写另一个“不是这样”的评论。你是对的,nslookup 没有返回任何对运行我的程序时出现的其他地址有用的信息。这就是整个程序。提出一个正确的问题来解决这个问题,然后呢?这里需要一种无需使用 WMI 即可获得 DNS 主机名的可靠方法,听起来仍然如此。
    • 这里的问题与代码无关——它与您的网络设置有关。基本上,如果网络上的一台机器想要另一台机器的主机名,只要给出它的 IP 地址,它就只有几个选择。 1)查看本地主机文件中是否有映射 - 对您的情况没有帮助。 2) 询问 DNS。除了一些传统的 NetBIOS 方法之外,这就是您所拥有的一切。 WMI 也无济于事。这确实是一个系统管理员问题 - 您的 DNS 服务器应该有这些机器的条目。如果没有这个想法,我真的想不出解决方案。
    • 非常感谢您的帮助。
    • 实际上 - 对我上面的评论稍作改动 - 如果你能做到这一点,WMI 会有所帮助,因为你可以使用 WMI 实际连接到远程机器并询问它的主机名(我很确定无论如何你都可以)。但是在您提到的 WMI 特权问题和 DNS 问题之间,我担心这两种解决方案都无法控制。
    猜你喜欢
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 2021-02-12
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多