Самый быстрый способ пинговать большой список IP-адресов? - PullRequest
3 голосов
/ 06 ноября 2011

У меня есть большой список IP-адресов в таблице данных, и я должен пинговать их так быстро, я использовал этот код:

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(); 

Моя проблема в том, что это занимает так много времени ине работает на заднем плане.Я имею в виду, что система занята, пока все IP-адреса в tbl_clientinfo не пройдут через класс ping.я хочу, чтобы система проверила все строки, так как я работаю с другой частью моего проекта.

Правильно ли я сделал?

Ответы [ 4 ]

2 голосов
/ 06 ноября 2011

Ваш код выполняет весь код в одном потоке; вы не используете несколько потоков. Кроме того, почему у вас там Thread.Sleep?

Попробуйте следующее:

  1. Запрос к базе данных и получение all IP-адресов
  2. В цикле раскрутите новый поток, который будет запускаться PingIP для каждого IP-адреса

Примечание: Вы также можете раскручивать новый поток каждый раз, когда получаете новую строку из базы данных

Пример:

    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 /3097333/neozhidannoe-povedenie-dlya-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;
    }
0 голосов
/ 23 июля 2014

вы можете использовать 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);

0 голосов
/ 06 ноября 2011

Рассмотрим системный вызов утилиты fping.Конечно, это не управляемый код, но fping очень хорошо оптимизирован для вашей конкретной задачи и упростит вашу задачу до одного вызова с последующей обработкой текстового списка результатов.

0 голосов
/ 06 ноября 2011

То, что я хотел бы сделать, это иметь отдельный многопоточный демон, работающий в фоновом режиме, выполняющий пинг и помещающий результаты в базу данных. Создайте страницу, которая загружает результаты через AJAX позже.

...