ping大量IP地址的最快方法是什么?

时间:2011-11-06 06:11:07

标签: c# multithreading visual-studio visual-studio-2010 thread-safety

我在数据表中有大量的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类。 我希望系统检查所有行,因为我正在使用我的项目的其他部分。

我做得对吗?

4 个答案:

答案 0 :(得分:2)

您的代码在单个线程上运行所有代码;你没有使用多个线程。另外,为什么你有Thread.Sleep

尝试以下方法:

  1. 查询数据库并获取all IP
  2. 在循环中,启动一个新线程,为每个 IP地址运行PingIP
  3. 注意:每次从数据库中获取新行时,您也可以启动新线程

    样品:

        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;
        }
    

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你可以使用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);