Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/22: Рейтинг темы: голосов - 22, средняя оценка - 4.82
2 / 2 / 1
Регистрация: 13.03.2012
Сообщений: 6
1

Асинхронный пинг сети и возврат пингующихся ip адресов

13.03.2012, 14:13. Показов 4183. Ответов 1
Метки нет (Все метки)

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


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
76
77
private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                //создаем класс управления событиями в потоке
                AutoResetEvent waiter = new AutoResetEvent(false);
                //записываем в массив байт сконвертированную в байтовый массив строку для отправки в пинг запросе
                byte[] buffer = Encoding.ASCII.GetBytes("test ping");
                //получаем имя хоста текущей машины
                string host = System.Net.Dns.GetHostName();
                //создаем список для адресов удаленных машин типа string
                List<string> serversList = new List<string>();
                //получаем ip машины по имени хоста
                System.Net.IPAddress ip = System.Net.Dns.GetHostByName(host).AddressList[0];
                log.Info("ip: " + ip);
                //разделяем ip машины на 4 составных части
                string[] ipParts = ip.ToString().Split('.');
                //создаем массив строк для записи туда всех 254 ip для их последующего пингования
                string[] ips = new string[254];
                //для каждого из последнего элемента начиная с 1 заканчивая 254
                for (int i = 1; i < 255; i++)
                {
                    //записываем в массив строк нужный ip для сканирования, собирая его из элементов, последний заменяя на текущее значение переменной i
                    ips[i - 1] = ipParts[0] + '.' + ipParts[1] + '.' + ipParts[2] + '.' + i.ToString();
                }
                //для каждого элемента из массива ip
                foreach (string ipToScan in ips)
                {
                    //пишем его в список адресов
                    serversList.Add(ipToScan);
                    log.Info("serverList: " + ipToScan);
                }
 
                //вообще все начиная с цикла for и до этого момента можно заменить так:
                //for (int i = 1; i < 255; i++)
                //{
                //      serversList.Add(ipParts[0] + '.' + ipParts[1] + '.' + ipParts[2] + '.' + i.ToString());
                //}
                //следующая строка не нужна, я ее закоментирую
                //object syncLock = new object();
                //для каждого элемента из списка адресов
                foreach (string server in serversList)
                {
                    //создаем класс пинг
                    Ping ping = new Ping();
                    //указываем на метод, который будет выполняться в результате получения ответа на асинхронный запрос пинга
                    ping.PingCompleted += new PingCompletedEventHandler(p_PingCompleted);
                    //выставляем опции для пинга (непринципиально)
                    PingOptions options = new PingOptions(64, true);
                    //посылаем асинхронный пинг на адрес с таймаутом 500мс, в нем передаем массив байт сконвертированных их строки в начале кода, используем при передаче указанные опции, после обращаемся к классу управления событиями
                    ping.SendAsync(IPAddress.Parse(server), 500, buffer, options, waiter);
                }
                //очищаем элемент на форму куда будут выводиться все успешные ипы.
                richTextBox1.Clear();
            }
            catch (Exception ex)
            {
                log.Info("Ошибка");
                log.Warn(ex.Message);
                log.Debug(ex.Message);
                log.Error(ex.Message);
            }
        }
 
        //этот метод вызывается при получении ответа на пинг
        private void p_PingCompleted(object sender, PingCompletedEventArgs e)
        {
            //проверяем не равен ли адрес откуда пришел ответ нулевому. вообще ответ от нулевого ip мы получаем в случае если ответа от запрашиваемого хоста нет (таймаут)
            if (e.Reply.Address.ToString() != "0.0.0.0")
            {
                //если не равен - выводим адрес с которого пришел ответ в текстовое поле на форме и делаем перенос строки
                richTextBox1.Text += e.Reply.Address.ToString() + "\r\n";
                log.Info("IP: " + e.Reply.Address.ToString());
            }
            //передаем событие о завершении выполнения ветки после получения ответа
            ((AutoResetEvent)e.UserState).Set();
        }
Спасибо!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.03.2012, 14:13
Ответы с готовыми решениями:

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

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

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

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

1
2 / 2 / 1
Регистрация: 13.03.2012
Сообщений: 6
15.03.2012, 12:39  [ТС] 2
Такой огромный форум и никто не может помочь сделать асинхронный пинг подсети?...

Добавлено через 37 минут
Подсказали решение на другом форуме, может кому пригодиться:
C#
1
2
3
4
5
6
7
8
9
10
11
private void p_PingCompleted (object sender, PingCompletedEventArgs e)
{
    if (e.Reply.Status == IPStatus.Success)
    {
        //выводим адрес с которого пришел ответ в текстовое поле на форме и делаем перенос строки
        richTextBox1.Text += e.Reply.Address.ToString() + "\r\n";
        log.Info("IP: " + e.Reply.Address.ToString());
    }
    // Let the main thread resume.
    ((AutoResetEvent)e.UserState).Set();
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2012, 12:39

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

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

Возврат адресов элементов массива
Здравствуйте. Подскажите пожалуйста, почему массив srr выдает адреса, а массив crr какую-то...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru