Подтвердить что ты не робот

Как получить IP-адрес всех хостов в локальной сети?

Мне нужно указать IP-адреса всех подключенных хостов в локальной сети. Каков самый простой способ сделать это?

4b9b3361

Ответ 1

Вам нужно будет выполнить пинг. Там есть класс Ping в пространстве имен System.Net. Пример. Также это возможно только в том случае, если на ваших компьютерах нет брандмауэров. Если у них включен брандмауэр, нет возможности определить эту информацию, не выполняя 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. Здесь IP-калькулятор. Вам нужно будет пропустить каждый адрес и выполнить ping-адрес с помощью класса Ping и проверить PingReply.

Если вы просто ищете информацию и не заботитесь о том, как вы ее получите, вы можете использовать NMap. Команда будет следующей:

nmap -sP 192.168.1.0/24

EDIT:

Что касается скорости, поскольку вы находитесь в локальной сети, вы можете значительно сократить интервал времени ожидания, так как ваши машины не должны принимать более 100 миллисекунд, чтобы ответить. Вы также можете использовать SendAsync для параллельной проверки их всех. Следующая программа выполнит 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();
        }
    }
}

EDIT: после некоторого использования этого я изменил программу, чтобы вывести количество ответов IP-адресов. Там a const bool, который, если установлен в true, заставит программу разрешить имена узлов IP-адресов. Тем не менее это значительно замедляет сканирование. (менее полусекунды до 16 секунд). Также выяснилось, что если IP-адрес указан неправильно (сделал опечатку самостоятельно), объект ответа может быть пустым, поэтому я обработал это.

Ответ 2

Вам понадобится создать диапазон адресов (например, 192.168.0.1 - 192.168.255.254) и выполнить ping для каждого из этих адресов. Если ответ получен, то этот хост активен.

Асинхронный Ping Tutorial:

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

Однако некоторые новые операционные системы блокируют запросы ping (ICMP). Это должно быть отключено в брандмауэре на каждом компьютере, чтобы вы получили ответ.

Ответ 3

Вы можете выполнить ping диапазон адресов и отметить, ответил ли хост. Конечно, это потребует, чтобы хост ответил на пакеты ping.

Ответ 4

Вы можете сделать все это в управляемом коде. Я использую System.DirectoryServices и System.Net. В основном я получаю имена локальных компьютеров от DirectoryServices (обрабатывая домены и рабочие группы, когда я иду), а затем получаю IP-адреса каждого хоста из System.Net.Dns. Здесь все упаковано в удобный класс...

public class NetworkComputer {
    private string _domain;
    private string _name;
    private IPAddress[] _addresses = null;

    public string Domain { get { return _domain; } }
    public string Name { get { return _name; } }
    public IPAddress[] Addresses { get { return _addresses; } }

    private NetworkComputer(string domain, string name) {
        _domain = domain;
        _name = name;
        try { _addresses = Dns.GetHostAddresses(name); } catch { }
    }

    public static NetworkComputer[] GetLocalNetwork() {
        var list = new List<NetworkComputer>();
        using(var root = new DirectoryEntry("WinNT:")) {
            foreach(var _ in root.Children.OfType<DirectoryEntry>()) {
                switch(_.SchemaClassName) {
                    case "Computer":
                        list.Add(new NetworkComputer("", _.Name));
                        break;
                    case "Domain":
                        list.AddRange(_.Children.OfType<DirectoryEntry>().Where(__ => (__.SchemaClassName == "Computer")).Select(__ => new NetworkComputer(_.Name, __.Name)));
                        break;
                }
            }
        }
        return list.OrderBy(_ => _.Domain).ThenBy(_ => _.Name).ToArray();
    }
}

Затем просто вызовите статический метод, чтобы получить массив компьютеров вашей локальной сети...

var localComputers = NetworkComputer.GetLocalNetwork();

Ответ 5

Вместо того, чтобы организовывать дикий пинг-вечеринку, вы могли бы (я действительно точно не знаю!) использовать NetBIOS (запросить, чтобы netbios наметил как-то?) http://technet.microsoft.com/en-us/library/cc757216%28WS.10%29.aspx. Или почему бы не спросить ваш сервер DHCP?

Ответ 6

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

        static void Main(string[] args)
        {
            string ipBase = getIPAddress();
            string[] ipParts = ipBase.Split('.');
            ipBase = ipParts[0] + "." + ipParts[1] + "." + ipParts[2] + ".";
            for (int i = 1; i < 255; i++)
            {
                string ip = ipBase + i.ToString();

                Ping p = new Ping();
                p.PingCompleted += new PingCompletedEventHandler(p_PingCompleted);
                p.SendAsync(ip, 100, ip);
            }
            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);
            }
        }

        public static string getIPAddress()
        {
            IPHostEntry host;
            string localIP = "";
            host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork)
                {
                    localIP = ip.ToString();
                }
            }
            return localIP;
        }
    }
}

Ответ 7

Ping на глобальный широковещательный IP-адрес (192.168.1.255)

Обычно мы получим ответ от всего хоста, подключенного к локальной сети.. Или если у вас есть какая-либо конкретная сеть для lan, пинг для этого широковещательного идентификатора сетей (т.е. последний IP-адрес в этом диапазоне).

Затем вы можете узнать весь IP-адрес, подключенный к хосту на LAN.