ShadowSniper
1

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

04.01.2013, 10:39. Показов 3801. Ответов 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, если пинг не прошел?

За кривой код прошу не унижать, ведь это не коммерческий проект, а небольшая утилитка для собственного пользования, которую я пишу чтобы хоть как-то освоить этот язык.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2013, 10:39
Ответы с готовыми решениями:

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

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

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

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

3
425 / 426 / 93
Регистрация: 16.07.2012
Сообщений: 886
04.01.2013, 12:00 2
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 3
результат этого код нормально в консоль выводится, а как сделать, чтобы вывести в текстбокс?
Я сделал (код ниже) - но результат = ничего. Это если код положить в класс 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
insite2012
18.10.2015, 20:42     Асинхронный пинг списка адресов
  #4
 Комментарий модератора 
Конторно, вы на дату последнего сообщения смотрели?
И если у вас есть вопрос, создавайте свою тему и там задавайте вопросы!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2015, 20:42

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

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

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

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

Сканирование списка IP-адресов в BackgroundWorker
Перепробовал кучу примеров, ни один не работает. Что требуется: простенькая задачка - в...

Вывод списка адресов и названий
Всем привет, очень прошу вашей помощи. Давно не практиковал и тут решил сделать небольшое...


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

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

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