ping大量IP地址的最快方法

本文关键字:方法 地址 大量 IP ping | 更新日期: 2023-09-27 18:13:34

我有一个大的IP地址列表在一个数据表,我必须ping他们这么快,我使用了以下代码:

public bool PingIP(string IP)
{
    bool result = false;
    try
    {                
        Ping ping = new Ping();
        PingReply pingReply = ping.Send(IP);
        if (pingReply.Status == IPStatus.Success)
            result = true;
    }
    catch
    {
        result = false;
    }
    return result;
}

然后在while循环中调用它:

private void CheckNetworkState()
{
    while (rowindexping > -1)
    {
        if (rowindexping == tbl_ClientInfo.Rows.Count)
        {
            rowindexping = -1;
            return;
        }
        string ip = tbl_ClientInfo.Rows[rowindexping]["clientip"].ToString();
        if (!PingIP(ip))
        {
           do something
        }
        rowindexping++;
        Thread.Sleep(100);
    }
}

因为我想在我的项目的后台做这项工作,我调用类在一个线程:

threadping = new Thread(CheckNetworkState);            
threadping.IsBackground = true;
threadping.Start(); 

我的问题是,它需要这么多的时间,并不能在后台工作。我的意思是系统一直很忙,直到tbl_clientinfo中的所有IP地址都通过ping类。我希望系统检查所有行,因为我正在与我的项目的其他部分工作。

我做对了吗?

ping大量IP地址的最快方法

你的代码在一个线程上运行所有的代码;您没有使用多个线程。还有,为什么这里有一个Thread.Sleep ?

尝试以下操作:

  1. 查询数据库获取all ip
  2. 在一个循环中,启动一个新线程,为每个 IP地址运行PingIP

注意:您也可以在每次从数据库获得新行时启动一个新线程

示例:

    static void Main(string[] args)
    {
        // get the IPs from the database so you can iterate over them
        List<string> ips = new List<string>()
        {
            "google.com",
            "127.0.0.1",
            "stackoverflow.com"
        };
        foreach (var ip in ips)
        {
            // See http://stackoverflow.com/questions/4744630/unexpected-behaviour-for-threadpool-queueuserworkitem
            // for reason to use another variable in the loop
            string loopIp = ip;
            WaitCallback func = delegate(object state)
            {
                if (PingIP(loopIp))
                {
                    Console.WriteLine("Ping Success");
                }
                else
                {
                    Console.WriteLine("Ping Failed");
                }
            };
            ThreadPool.QueueUserWorkItem(func);
        }
        Console.ReadLine();
    }
    public static bool PingIP(string IP)
    {
        bool result = false;
        try
        {
            Ping ping = new Ping();
            PingReply pingReply = ping.Send(IP);
            if (pingReply.Status == IPStatus.Success)
                result = true;
        }
        catch
        {
            result = false;
        }
        return result;
    }

我要做的是在后台运行一个单独的多线程守护进程,执行ping,并将结果放入数据库中。有一个页面,稍后通过AJAX加载结果。

考虑对ping实用程序进行系统调用。诚然,它不是托管代码,但是ping针对您的特定任务进行了很好的优化,并将您的问题简化为单个调用,然后处理基于文本的结果列表。

你可以使用powershell

private string resultat(string s)
{
    Runspace space = RunspaceFactory.CreateRunspace();
    space.Open();
    Pipeline pipeline = space.CreatePipeline();
    pipeline.Commands.AddScript(s);
    pipeline.Commands.Add("Out-String");
    Collection<PSObject> results = pipeline.Invoke();
    StringBuilder stringBuilder = new StringBuilder();
    foreach (PSObject obj in results)
    {
        stringBuilder.AppendLine(obj.ToString());
    }
    return stringBuilder.ToString();
}
然后使用resultat("ping -l 10 -n 2 " + your_ip);