Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
11 / 1 / 1
Регистрация: 09.02.2016
Сообщений: 95
1

Медленный пинг

19.04.2016, 19:23. Просмотров 978. Ответов 2
Метки нет (Все метки)


Добрый день, уважаемые знатоки

Собственно возникла проблема в timeout ping.SendPingAsync(...);

Проблема:
Дело в том, что на вход, допустим поступает 100+ IP адрессов, все бы хорошо, но сканит он их относительно медленно.
А точнее, если компьютеры онлайн - вуаля, пару секунд и все готово... Но если большинство из них имеют статус Offline - то это уже мука.

Возможное решение:
Указать параметр timeout... Но как ни странно - это не помогает.

Мой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private async void button2_Click(object sender, EventArgs e)
{
    Ping ping = new Ping();
    PingReply reply;
 
    try
    {
        string IP = node.Text;
        reply = await ping.SendPingAsync(IP, 5);
        
        status = reply.Status == IPStatus.Success ? 1 : 2;
    }
    catch
    {
        // ...
    }
    finally
    {
        // ...
    }
}
При проверке всей подсети, уходит около минуты - это очень долго. В то время, как тот-же LanScope справляется в 10-15 секунд. Как быть? Может есть другие варианты проверки статуса компьютера?

Добавлено через 44 минуты
Нашел как вариант запустить пинг в 40 потоков (но это походу уже идиотизм)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
using System.Collections;
using System.Net.NetworkInformation;
using System.Threading;
 
namespace PingThreading
{
    class Program
    {
        public static Queue targets = Queue.Synchronized(new Queue());
        public static Queue results = Queue.Synchronized(new Queue());
 
        static void Main(string[] args)
        {
            DateTime start = DateTime.Now;
 
           //Load ipaddresses into targets queue
            for (int i = 1; i < 255; i++)
            {
                targets.Enqueue(string.Format("192.168.0.{0}", i));
            }
 
            int threadIsAliveCount = 0;
 
           //Specify number of threads
            Thread[] t = new Thread[40];
 
           //Start up the threads
            for (int i = 0; i < t.Length; i++)
            {
                t[i] = new Thread(new ThreadStart(pinger));
                t[i].Start();
                threadIsAliveCount++;
            }
 
            //Loop if threads are still active
            while (threadIsAliveCount > 0)
            {
                threadIsAliveCount = 0;
                foreach (Thread et in t)
                {
                    if (et.IsAlive)
                    {
                        threadIsAliveCount++;
                    }
                }
 
                //Dequeue results and output to console
                while (results.Count > 0)
                {
                    Console.WriteLine("{0}", results.Dequeue());
                }
            }
 
            Console.WriteLine("All done, elapsed seconds = {0}",
                    DateTime.Now.Subtract(start).Seconds);
        }
 
        //Action module executed by each thread
        static void pinger()
        {
            while (targets.Count>0)
            {
                string addr = targets.Dequeue().ToString();
                if (new Ping().Send(addr, 1000).Status == IPStatus.Success)
                {
                    results.Enqueue(addr);
                }
            }
 
            //Delay thread termination by 500ms to allow dequeueing of results.
            Thread.Sleep(500);
        }
    }
}
Добавлено через 17 минут
Однако это тоже не помогло в WinForm приложении...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2016, 19:23
Ответы с готовыми решениями:

Почему такой способ копирования значений байт Bitmap медленный?
public static byte BitmapToByteRgbNaive(Bitmap bmp) { int width = bmp.Width, height...

Чтение COM-порта: медленный вывод в textBox несколько тысяч строк (метод AppendText)
Доброго времени суток! Читаю данные с последовательного порта. Конвертирую каждые три байта и...

Пинг Понг в C#
Кто знает как сделать пинг понг в C#

Ограничение на пинг
Здравствуйте, софтина пингует несколько адресов по таймеру, но при таймауте на одном зависает ,...

2
Хитрая блондиночка $)
1461 / 976 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
19.04.2016, 19:26 2
Цитата Сообщение от Scrud Посмотреть сообщение
В то время, как тот-же LanScope справляется в 10-15 секунд.
Возможно у него и потоковый пул (5-10 одновременно работающих потоков) и таймаут используется.
0
11 / 1 / 1
Регистрация: 09.02.2016
Сообщений: 95
19.04.2016, 20:12  [ТС] 3
Цитата Сообщение от Hikari Посмотреть сообщение
Возможно у него и потоковый пул (5-10 одновременно работающих потоков) и таймаут используется.
Собственно timeout и у меня используется. Но Даже при запуске в 40 потоков - получаем чуть меньше минуты, но не 10 секунд. Хотя в ConsoleApplication это заняло секунды.

UPD:
Все в норме. Запускал в 5 потоков просто... Исправил на 40 стало укладываться в 3 секунды

UPD2:
Добавлено через 38 минут
Ну и последний вопрос... Пошел копать в сторону BackgroundWorker.... Но столкнулся с маленькой неприятностью:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
//...
while (results.Count > 0)
                {
                    worker.ReportProgress(progressBar1.Value);
                }
// ...
 
private void worker_progessWork(object sender, ProgressChangedEventArgs e)
        {
// ...
            var status = (statusComputer)results.Dequeue();
            // ...
        }
Но почему-то worker_progessWork срабатывает и при results.Count == 0, приходится вставлять костыль в виде:
C#
1
if (results.Count == 0) return;
Может кот-то подскажет с чем это связанно?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.04.2016, 20:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Пинг-понг
ребята Help please1 Надо сделать пинг-понг, вроде все более-менее вот тока отбивание от реек чере...

Создать команду пинг
Доброе время суток. Помогите создать Консольное приложение, для Пинга сети от...

Асинхронный пинг списка адресов
C# изучаю недавно, возникла потребность решить одну задачу. Суть задачи: Программа получает...

Игра на подобии пинг-понга
Необходима ваша помощь. Срочно очень! Нужно создать программу с использованием принципов ООП на...

Пинг понг, рассчитать направление шарика
Добрый вечер) пишу курсовую. времени до сдачи осталось мало. у меня такая проблема - не могу...

Медленный SharpDX 2D
Привет всем! Есть задача: отрисовать около 150 многоугольников примерно по 100-200 точек,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.