如何快速ping网络中的所有IP地址? [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何快速ping网络中的所有IP地址? [重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

所以我在c#中制作一个网络扫描器,将所有连接的设备显示在同一网络中。我这样做的方法是对从192.168.0.1到192.168.0.255的所有IP执行ping命令。

private void IPlook_Tick(object sender, EventArgs e)
    {

        Properties.Settings.Default.nextIP += 1;

        if (Properties.Settings.Default.nextIP >= 255)
        {
            IPlook.Stop();
        }

        string IP = "192.168.0." + Properties.Settings.Default.nextIP.ToString();
        CurIP.Text = IP;

        //See if online
        try
        {
            Ping ping = new Ping();
            PingReply pingreply = ping.Send(IP);

            if (pingreply.Status == IPStatus.Success)
            {
                string Hostname = Dns.GetHostByAddress(IP).HostName;
                dataGridView1.Rows.Add(Hostname, IP, "");
            }
            else
            {
            }

        }
        catch (Exception er)
        {
            MessageBox.Show("Something Went Wrong", "Error Alert", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

    }

这工作正常,但问题是需要很长时间并使程序滞后。我已将计时器的间隔设置为50。

任何帮助表示赞赏。

合法

答案

你是一个接一个地运行ping。这意味着您必须等待超时到期255次。同时启动多次ping。使用await在这里会有很多意义。

此外,取消阻止UI线程,以便在此过程中不冻结UI。有许多技术可以做到这一点。 await恰好解决了这个问题。

我不明白你为什么要使用计时器。如果没有理由那么简单地删除所有计时器的东西。使用循环。

另一答案
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            // Can build your list of IPs using a for loop
            List<IPAddress> ips = new List<IPAddress>
            {
                new IPAddress(new byte[] {192, 168, 0, 1}),
                new IPAddress(new byte[] {192, 168, 0, 2}),
                // More ips in this list.
            };

            // Exactly what do you do with initiated tasks will depend on your specific scenario.
            List<Task> tps = new List<Task>();

            foreach(var ip in ips)
            {
                tps.Add(InitiatePing(ip));
            }

            // Needed so that console app doesn't exit..
            Console.ReadLine();
        }

        private static async Task InitiatePing(IPAddress ip)
        {
            // Note, this API is different from SendAsync API you are using
            // You may also want to reuse Ping instance instead of creating new one each time.
            var result = await new Ping().SendPingAsync(ip);
            // Process your result here, however you want.
            Console.WriteLine(result.Address + "-" + result.Status + "-" + result.RoundtripTime);
        }
    }
}
另一答案

怎么样立刻解雇他们(从async方法):

IPAddress start = IPAddress.Parse("192.168.1.1");
var bytes = start.GetAddressBytes();
var leastSigByte= start.GetAddressBytes().Last();
var range= 255 - leastSigByte;

var pingReplyTasks = Enumerable.Range(leastSigByte,range)
    .Select(x=>{
        var p = new Ping();
        var bb = start.GetAddressBytes();
        bb[3] = (byte)x;
        var destIp = new IPAddress(bb);
        var pingResultTask = p.SendPingAsync(destIp);
        return new{pingResultTask, addr = destIp};
    })
    .ToList();

await Task.WhenAll(pingReplyTasks.Select(x=>x.pingResultTask));

foreach(var pr in pingReplyTasks)
{
    var tsk = pr.pingResultTask;
    var pingResult = tsk.Result; //we know these are completed tasks
    var ip = pr.addr;

    Console.WriteLine("{0} : {1}",ip,pingResult.Status);
}

你可能不想ping addresses ending in 0 or 255

另一答案

好吧,如果我正确地读取你的代码你就会允许定时器触发255次,并且每次执行时都只能ping一台计算机。我不确定为什么你使用Settings类来存储当前的迭代次数。

您可以循环1到255并使用Ping.SendAsync方法异步启动每个Ping请求。不需要计时器。

另请参阅this question以及有关广播ping的答案/评论。

以上是关于如何快速ping网络中的所有IP地址? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ping IP通 ping 主机名不通 如何解决?

windows和linux如何互ping

如何解决路由器Loopback地址ping不通问题

电脑经常用的命令'ping'是啥意思啊,怎么应用啊

如何获取局域网中的所有IP地址?

安卓如何PING ip地址?