1

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

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

非常感谢所有帮助。

4

1 回答 1

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 地址。”

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

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

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

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

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

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

于 2010-01-04T23:22:26.353 回答