首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何快速平分网络中的所有ip地址?

如何快速平分网络中的所有ip地址?
EN

Stack Overflow用户
提问于 2014-11-16 17:29:57
回答 4查看 2.1K关注 0票数 0

因此,我正在用c#制作一个网络扫描仪,以显示所有连接到与您相同的网络的设备。我这样做的方式是在192.168.0.1到192.168.0.255的所有IP上执行ping命令。

代码语言:javascript
复制
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。

任何帮助都是非常感谢的。

合法

EN

回答 4

Stack Overflow用户

发布于 2014-11-16 17:49:03

一次(从async方法)将它们全部触发如何?

代码语言:javascript
复制
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 以0或255结尾的地址

票数 2
EN

Stack Overflow用户

发布于 2014-11-16 17:41:36

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

另外,取消阻止UI线程,以便在此过程中不冻结UI。有许多技术可用于实现这一目的。await碰巧也解决了这个问题。

我不明白你为什么要用计时器。如果没有理由这样做,只需删除所有计时器内容。用一个循环。

票数 0
EN

Stack Overflow用户

发布于 2014-11-16 17:42:50

好吧,如果我正确地阅读了你的代码,你就允许计时器触发255次,并且每次执行时只敲击一台计算机。我不知道为什么要使用Settings类来存储当前的迭代次数。

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

另见这个问题和有关广播敲击的答案/评论。

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

https://stackoverflow.com/questions/26959905

复制
相关文章

相似问题

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