首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获取局域网内所有主机的IP地址?

如何获取局域网内所有主机的IP地址?
EN

Stack Overflow用户
提问于 2010-10-28 20:15:55
回答 7查看 63.3K关注 0票数 32

我需要列出LAN中所有连接的主机的IP地址。执行此操作的最简单方法是什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-10-28 20:26:29

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

代码语言:javascript
复制
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。这里有一个IP Calculator可以提供帮助。您必须遍历每个地址,并使用ping类对地址执行Ping操作,然后检查PingReply。

如果你只是在寻找信息,而不关心如何获得它,你可以使用NMap。该命令将如下所示

代码语言:javascript
复制
nmap -sP 192.168.1.0/24

编辑:

就速度而言,由于您是在本地网络上,您可以大大缩短超时间隔,因为您的机器响应时间不应超过100毫秒。您还可以使用SendAsync并行地对它们执行ping操作。下面的程序将在半秒内ping 254地址。

代码语言:javascript
复制
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();
        }
    }
}

编辑:在我自己使用它之后,我修改了程序,输出了有多少个IP响应。有一个const布尔值,如果设置为true,将导致程序解析IP的主机名。不过,这会显著减慢扫描速度。(不到半秒到16秒)还发现,如果IP地址指定不正确(我自己也犯了一个打字错误),回复对象可能为空,所以我对此进行了处理。

票数 58
EN

Stack Overflow用户

发布于 2010-10-28 20:23:24

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

异步Ping教程:

http://www.geekpedia.com/tutorial234_Asynchronous-Ping-using-Csharp.html

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

票数 2
EN

Stack Overflow用户

发布于 2010-10-28 20:21:47

您可以对地址范围执行ping操作,并注意主机是否响应。当然,这需要主机响应ping数据包。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4042789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档