Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
ShadowSniper

Асинхронный пинг списка адресов

04.01.2013, 10:39. Показов 5212. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C# изучаю недавно, возникла потребность решить одну задачу.

Суть задачи:
Программа получает список доменов, пингует его, все "живые домены" пихает в один файл, оставшиеся "мертвые" - в другой.

Есть работающая функция, но работает она достаточно медленно:
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
 
private bool PingUrl(string URL, int pingTimeOut)
{
try
            {
                Ping pingSender = new Ping();
                PingReply pingReply = null;
 
                pingReply = pingSender.Send(URL, pingTimeOut);
                
                if (pingReply.Status != IPStatus.TimedOut)
                {                    
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {               
                return false;
            }
}
Возникло желание перевести эту функцию под асинхронный пинг. В интернете нарыл следующее решение:
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
private bool PingUrl(string URL, int pingTimeOut)
        {
            try
            {
                AutoResetEvent waiter = new AutoResetEvent(false);
 
                Ping pingSender = new Ping();
 
                string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
                byte[] buffer = Encoding.ASCII.GetBytes(data);
                PingOptions options = new PingOptions(64, true);
 
                pingSender.PingCompleted += new PingCompletedEventHandler(PingCompletedCallback);
 
                pingSender.SendAsync(URL, pingTimeOut, buffer, options, waiter);
 
                waiter.WaitOne();
                
            }
            catch (Exception)
            {
                return false;
            }
        }
 
        private static void PingCompletedCallback(object sender, PingCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                ((AutoResetEvent)e.UserState).Set();
            }
 
            if (e.Error != null)
            {
                ((AutoResetEvent)e.UserState).Set();
            }
            
            PingReply reply = e.Reply;
 
            DisplayReply(reply);
 
            ((AutoResetEvent)e.UserState).Set();
        }
 
        public static bool DisplayReply(PingReply reply)
        {
            if (reply == null)
                return false;
            else if (reply.Status == IPStatus.Success)
            {
                return true;
            }
            else return false;
        }
Как заставить функцию PingUrl возвращать true, если домен пингуется или false, если пинг не прошел?

За кривой код прошу не унижать, ведь это не коммерческий проект, а небольшая утилитка для собственного пользования, которую я пишу чтобы хоть как-то освоить этот язык.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2013, 10:39
Ответы с готовыми решениями:

Асинхронный пинг сети и возврат пингующихся ip адресов
Добрый времени суток! Помогите пожалуйста решить проблему. Написал асинхронный пинг сети, всё работает и пингуеться, проблема в...

Асинхронный пинг
Пытаюсь запрограммировать асинхронный пинг, используя пример из msdn но при заполнении таблицы заполняется только первый ipaddress,...

Асинхронный пинг множества хостов
Пытаюсь написать пингер. Есть множество хостов host которые нужно периодически пинговать, и есть массив pingTime, который нужно заполнять...

3
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
04.01.2013, 12:00
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
static void Main(string[] args)
{
    var urls = new List<string> { "google.com", "123.456", "mail.ru" };
    var goodUrls = new List<string>();
    var badUrls = new List<string>();
    var timeout = 1000;
    var sync = new object();
    var counter = urls.Count;
    var isReady = new ManualResetEvent(false);
    foreach (var u in urls)
    {
        var url = u;
        var ping = new Ping();
        ping.PingCompleted += (s, e) =>
        {                    
            lock (sync)
            {
                ping.Dispose();
                if (e.Reply.Status == IPStatus.Success)
                {
                    goodUrls.Add(url);
                }
                else
                {
                    badUrls.Add(url);
                }
                if (--counter == 0)
                {
                    isReady.Set();
                }
            }
        };
        ping.SendAsync(u, timeout, null);
    }
    isReady.WaitOne();          
}
Добавлено через 9 минут
То есть, тут без многопоточности вам видимо не обойтись. Создаем в цикле сразу по собственному Ping на каждый адрес и запускаем их все сразу асинхронно, а потом в основном потоке ожидаем пока все не завершатся. Для извещения о завершении используем счетчик и событие ManualResetEvent. В обработчике события PingCompleted проверяем как завершился пинг и помещаем его в соответствующий список. Так как PingCompleted каждый раз вызывается в другом потоке, то не забываем про синхронизацию (здесь - просто через lock). Также не забываем про то, что Ping является IDisposable, поэтому после завершения работы с ним нужно обязательно вызывать для него Dispose().
2
 Аватар для Конторно
2 / 2 / 1
Регистрация: 04.05.2012
Сообщений: 77
18.10.2015, 17:51
результат этого код нормально в консоль выводится, а как сделать, чтобы вывести в текстбокс?
Я сделал (код ниже) - но результат = ничего. Это если код положить в класс Pings и метод PingMethod();


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private void button1_Click(object sender, EventArgs e)
        {
            List<string> goods = new List<string>();
            goods = Pings.PingMethod();            
 
            if (goods != null)
            {
                foreach (var item in goods)
                {
                    richTextBox1.Text += item;
                }
            }
            else
            {
                richTextBox1.Text += "Пусто";
            }
        }
0
18.10.2015, 20:42
 Комментарий модератора 
Конторно, вы на дату последнего сообщения смотрели?
И если у вас есть вопрос, создавайте свою тему и там задавайте вопросы!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.10.2015, 20:42
Помогаю со студенческими работами здесь

Пинг адресов в DataGridView
Здравствуйте, пишу что то типа приложения по контролю за ip адресами. Все данные хранятся в БД, я их сначала туда добавляю, а потом...

Пинг IP адресов через консоль windows
Доброго времени суток, недавно начал изучать C# и столкнулся с таким вопросом: можно ли сделать ввод в консоль windows через текст бокс?...

Пинг множества ip адресов в разных подсетях
каким образом за раз можно пропинговать много ip. может bat какой создать?

Как написать батник, который бы выполнял пинг ip- адресов из блокнота и переименовывал диалоговые окна?
Прошу подсказать как написать батник, который бы выполнял пинг ip- адресов из блокнота и переименовывал диалоговые окна, беря так же имена...

Пинг списка ПК и запись в лог тех ПК, которые не пингуются
Здрям! Вот так не пишет: @ echo on chcp 855 for /F &quot;tokens=*&quot; %%A in (D:\iplist.txt) do (ping -i 250 -n 2 %%A &amp; if...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru