如何获取局域网中所有主机的IP?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (23)

我需要列出我局域网内所有连接主机的IP地址。做这件事最简单的方法是什么?

提问于
用户回答回答于

你必须做一个ping扫描。System.Net命名空间中有一个Ping类。示例如下。此外,只有当你的计算机没有运行防火墙时才可能。如果他们已启用防火墙,则无法在交换机上执行SNMP查询时确定此信息。

System.Net.NetworkInformation.Ping p = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingReply rep = p.Send("192.168.1.1");
if (rep.Status == System.Net.NetworkInformation.IPStatus.Success)
{
    //host is active
}

另一个问题是确定你的网络有多大。在大多数家庭情况下,你的网络掩码将是24位。这意味着它的设置为255.255.255.0。如果你的网关是192.168.1.1,这意味着你网络上的有效地址是192.168.1.1到192.168.1.254。你必须循环访问每个地址,然后使用Ping类ping地址并检查PingReply。

如果你只是在寻找信息,而不关心如何获取信息,则可以使用NMap。该命令如下

nmap -sP 192.168.1.0/24

编辑:

就速度而言,由于位于本地网络,因此你的机器应该不会超过100毫秒的响应时间,因此可以大幅缩短超时间隔。还可以使用SendAsync来并行ping所有设备。以下程序将在半秒内ping 254地址。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.NetworkInformation;
using System.Diagnostics;
using System.Net;
using System.Threading;
using System.Net.Sockets;

namespace ConsoleApplication1
{
    class Program
    {
        static CountdownEvent countdown;
        static int upCount = 0;
        static object lockObj = new object();
        const bool resolveNames = true;

        static void Main(string[] args)
        {
            countdown = new CountdownEvent(1);
            Stopwatch sw = new Stopwatch();
            sw.Start();
            string ipBase = "10.22.4.";
            for (int i = 1; i < 255; i++)
            {
                string ip = ipBase + i.ToString();

                Ping p = new Ping();
                p.PingCompleted += new PingCompletedEventHandler(p_PingCompleted);
                countdown.AddCount();
                p.SendAsync(ip, 100, ip);
            }
            countdown.Signal();
            countdown.Wait();
            sw.Stop();
            TimeSpan span = new TimeSpan(sw.ElapsedTicks);
            Console.WriteLine("Took {0} milliseconds. {1} hosts active.", sw.ElapsedMilliseconds, upCount);
            Console.ReadLine();
        }

        static void p_PingCompleted(object sender, PingCompletedEventArgs e)
        {
            string ip = (string)e.UserState;
            if (e.Reply != null && e.Reply.Status == IPStatus.Success)
            {
                if (resolveNames)
                {
                    string name;
                    try
                    {
                        IPHostEntry hostEntry = Dns.GetHostEntry(ip);
                        name = hostEntry.HostName;
                    }
                    catch (SocketException ex)
                    {
                        name = "?";
                    }
                    Console.WriteLine("{0} ({1}) is up: ({2} ms)", ip, name, e.Reply.RoundtripTime);
                }
                else
                {
                    Console.WriteLine("{0} is up: ({1} ms)", ip, e.Reply.RoundtripTime);
                }
                lock(lockObj)
                {
                    upCount++;
                }
            }
            else if (e.Reply == null)
            {
                Console.WriteLine("Pinging {0} failed. (Null Reply object?)", ip);
            }
            countdown.Signal();
        }
    }
}

用户回答回答于

你需要构建一个地址范围(例如,192.168.0.1-192.168.255.254),并对每个地址进行ping。如果接收到响应,则该主机处于活动状态。

异步ping教程:

http://www.geekparia.com/tutorial 234_异步-ping-使用-Cserp.html

然而,一些较新的操作系统阻止ping请求(ICMP)。需要在每台计算机上的防火墙中禁用此功能,才能接收响应。

扫码关注云+社区