Можно ли получить список IP-адресов, подключенных в локальной сети, в C # без использования библиотеки Win32 API.? - PullRequest
1 голос
/ 12 мая 2011

Я пытаюсь получить список IP-адресов, которые подключены в локальной сети, Можно ли получить без использования Win32 API библиотеки. (Netapi32.dll). Любая идея получить без использования неуправляемой win32 динамической библиотеки.target для операционной системы Windows 7

Ответы [ 3 ]

2 голосов
/ 18 мая 2011

Вы можете использовать System.Net.NetworkInformation.Ping , чтобы пропинговать каждый IP в вашей подсети, если вы получите ответ, что есть машина, использующая этот ip. Если вы не получили ответ, что ip доступен, или машина игнорирует эхо-запросы.

Обновлено, чтобы добавить код для параллельного выполнения.

public string IPList()
        {
            string myipsplit = string.Empty;
            string localhostname = Dns.GetHostName();
            IPAddress[] paddresses = Dns.GetHostAddresses(localhostname);
            string myip = paddresses.Where( ip => ip.AddressFamily == AddressFamily.InterNetwork).FirstOrDefault().ToString();
            string[] myiparray = myip.Split(new[] { '.' });
            for (int j = 1; j < myiparray.Length; j++)
                myipsplit += myiparray[j - 1] + ".";
            Trace.WriteLine(DateTime.Now);
            var results = new string[0x100];
            System.Threading.Tasks.Parallel.For(1, 0x100, id =>
                           {
                              var pingSender = new Ping();
                              string ls = myipsplit + id;
                              PingReply reply = pingSender.Send(ls, 100);
                              if (reply != null)
                                    if (reply.Status == IPStatus.Success)
                                        results[id] = reply.Address.ToString();
                            });

            Trace.WriteLine(DateTime.Now);
            var sb = new StringBuilder();
            results.All(x => { sb.AppendFormat("{0} ", x);
                                 return true;
            });
            return sb.ToString();
        }

Обновлен до .Net 2.0

private delegate void MyPing(int id);
        public string IPList2()
        {

            string myipsplit = string.Empty;
            string localhostname = Dns.GetHostName();
            IPAddress[] paddresses = Dns.GetHostAddresses(localhostname);
            string myip = paddresses.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork).FirstOrDefault().ToString();
            string[] myiparray = myip.Split(new[] { '.' });
            for (int j = 1; j < myiparray.Length; j++)
                myipsplit += myiparray[j - 1] + ".";
            Trace.WriteLine(DateTime.Now);
            var results = new string[0x100];
            MyPing ping = 
             id =>
            {
                string ls = myipsplit + id;
                var pingSender = new Ping();
                PingReply reply = pingSender.Send(ls, 100);
                if (reply != null)
                    if (reply.Status == IPStatus.Success)
                        results[id] = reply.Address.ToString();
            };
            var asyncResults = new IAsyncResult[0x100];
            for (int i = 1; i < 0x100; i++)
            {
                asyncResults[i] = ping.BeginInvoke(i, null, null);
            }
            for (int i = 1; i < 0x100; i++)
            {
                ping.EndInvoke(asyncResults[i]);
            }
            Trace.WriteLine(DateTime.Now);
            var sb = new StringBuilder();
            for (int i = 1; i < 0x100; i++)
            {
                if (results[i]!=null)
                    sb.AppendFormat("{0} ", results[i]);
            }
            return sb.ToString();
        }
0 голосов
/ 30 мая 2011
public string IPList()
        {
            var pingSender = new Ping();
            string port = string.Empty;
            string myipsplit = string.Empty;
            string localhostname = Dns.GetHostName();
            IPAddress[] paddresses = Dns.GetHostAddresses(localhostname);
            string myip = paddresses[0].ToString();
            string[] myiparray = myip.Split(new[] {'.'});
            for (int j = 1; j < myiparray.Length; j++)
                myipsplit += myiparray[j - 1] + ".";
            Trace.WriteLine(DateTime.Now);
            for (int i = 0; i < 0x100; i++)
            {
                string ls = myipsplit + i;
                PingReply reply = pingSender.Send(ls, 0);
                if (reply != null)
                    if (reply.Status == IPStatus.Success)
                        port += reply.Address + "+";
            }
            Trace.WriteLine(DateTime.Now);
            return port;
        }
0 голосов
/ 12 мая 2011

Вы можете использовать объект NetworkInterface для получения всех сетевых интерфейсов машин.

var networkCards = System.Net.NetworkInterface.GetAllNetworkInterfaces();
foreach(var card in networkCards)
    Console.WriteLine(card.GetPhysicalAddress());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...