С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
1

Часто, при пинге сервера программа подвисает на 1-2 секунды и выдаёт значение пинга 0

22.04.2015, 14:08. Показов 2248. Ответов 14
Метки icmp (Все метки)

Author24 — интернет-сервис помощи студентам
Создал программу для проверки пинга. Часто, при пинге сервера программа подвисает на 1-2 секунды и выдаёт значение пинга 0. Есть ли какое-то исключение, которое можно заточить в try catch, что бы программа не зависала?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2015, 14:08
Ответы с готовыми решениями:

При решении программа выдаёт значение функции, равное 0 или выдаёт ошибку. Что не так?
#include <iostream> #include <iomanip> #include <cmath> using namespace std; long Fact(short...

Программа подвисает, но не выдаёт исключение
using System; using System.Threading; namespace ConsoleApplication1 { class Program...

Зависание программы при попытке пинга сервера
Доброго времени суток, Написал программу для переделки обычного ПК с ОС Windows в некое подобие...

Заменить один текстовый файл на другой при отсутствии пинга до сервера и вернуть все обратно при его появлении
Добрый день. Нужно заменить один текстовый файл на другой при отсутствии пинга до сервера и...

14
Администратор
Эксперт .NET
17696 / 13823 / 5313
Регистрация: 17.03.2014
Сообщений: 28,340
Записей в блоге: 1
22.04.2015, 14:27 2
OpenGoodwin, "зависание" программы говорит что ты делаешь ping в главном потоке приложения. Выполняй этот код в отдельном потоке и зависаний не будет. Ну и надо отметить что никакой try/catch здесь не поможет.

Что касается нулевого пинга, то нужно смотреть как ты его реализовал.
0
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
22.04.2015, 14:30  [ТС] 3
OwenGlendower, даю отрезок кода.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
try
                    {
                        System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
                        System.Net.NetworkInformation.PingReply pingReply = ping.Send("login.worldofwarships.ru");
                        if (pingReply.RoundtripTime <= 70)
                        {
                            label32.ForeColor = System.Drawing.Color.Green;
                        }
                        else if (pingReply.RoundtripTime >= 70 && pingReply.RoundtripTime <= 120)
                        {
                            label32.ForeColor = System.Drawing.Color.Orange;
                        }
                        else if (pingReply.RoundtripTime >= 120)
                        {
                            label32.ForeColor = System.Drawing.Color.Red;
                        }
                        label32.Text = pingReply.RoundtripTime.ToString();
                    }
                    catch (PingException)
                    {
                        label32.ForeColor = System.Drawing.Color.Red;
                        label32.Text = "Ошибка";
                    }
0
Администратор
Эксперт .NET
17696 / 13823 / 5313
Регистрация: 17.03.2014
Сообщений: 28,340
Записей в блоге: 1
22.04.2015, 14:40 4
Лучший ответ Сообщение было отмечено OpenGoodwin как решение

Решение

OpenGoodwin, ты отправляешь ping только один раз. Похоже что иногда он не проходит и поэтому RoundtripTime равен 0. Тут возможны два решения - простое и правильное Простое - добавить проверку свойства Status. Если оно равно IPStatus.Success, то тогда можно выводить RoundtripTime, иначе ошибка. Правильное решение это отправлять ping несколько раз подряд чтобы накопить статистику. Тебе уже приводили пример для отправки нескольких ping-ов. Модифицируй его чтобы еще накапливалось среднее время ответа и ориентируйся на него.
1
2 / 2 / 1
Регистрация: 11.02.2015
Сообщений: 57
22.04.2015, 14:52 5
Кто мешает сделать вот так:
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
try
            {
                System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
                System.Net.NetworkInformation.PingReply pingReply = ping.Send("login.worldofwarships.ru");
                if (pingReply.RoundtripTime <= 70 && pingReply.RoundtripTime >= 1)
                {
                    label32.ForeColor = System.Drawing.Color.Green;
                }
                else if (pingReply.RoundtripTime >= 70 && pingReply.RoundtripTime <= 120)
                {
                    label32.ForeColor = System.Drawing.Color.Orange;
                }
                else if (pingReply.RoundtripTime >= 120)
                {
                    label32.ForeColor = System.Drawing.Color.Red;
                }
                else if (pingReply.RoundtripTime == 0)
                {
                    label32.Text = "Сервер умер :)";
                }
                if (pingReply.RoundtripTime != 0)
                {
                    label32.Text = pingReply.RoundtripTime.ToString();
                }
             }
            catch (PingException)
            {
                label32.ForeColor = System.Drawing.Color.Red;
                label32.Text = "Ошибка";
            }
Добавлено через 8 минут
Вывести это в отдельный метод pingtoserver, вызвать его в новом потоке:
C#
1
2
Thread pingThread = new Thread(pingtoserver);
pingThread.Start();
0
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
22.04.2015, 15:30  [ТС] 6
OwenGlendower, спасибо Буду разбираться с тем кодом.

Добавлено через 35 минут
dok221, Вы забыли указать, что нужно так же реализовывать систему Invoke. Ведь поток не может получить доступ к label из другого потока. Ну да ладно, я с этим помаялся. Сделал. Теперь другая проблема. При инвоке не выводится пинг:

C#
1
if (label33.InvokeRequired) label33.Invoke(new Action(() => pingReply.RoundtripTime.ToString()));
0
Администратор
Эксперт .NET
17696 / 13823 / 5313
Регистрация: 17.03.2014
Сообщений: 28,340
Записей в блоге: 1
22.04.2015, 15:35 7
Цитата Сообщение от OpenGoodwin Посмотреть сообщение
if (label33.InvokeRequired) label33.Invoke(new Action(() => pingReply.RoundtripTime.ToString()));
Это равносильно коду:
C#
1
pingReply.RoundtripTime.ToString();
То есть результат ToString() уходит в никуда. Надо так:
C#
1
label33.Invoke(new Action(() => { label33.Text = pingReply.RoundtripTime.ToString(); } ));
0
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
22.04.2015, 15:39  [ТС] 8
OwenGlendower, точно, спасибо.
0
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
22.04.2015, 15:54  [ТС] 9
А что это за ошибка?
Миниатюры
Часто, при пинге сервера программа подвисает на 1-2 секунды и выдаёт значение пинга 0  
0
Администратор
Эксперт .NET
17696 / 13823 / 5313
Регистрация: 17.03.2014
Сообщений: 28,340
Записей в блоге: 1
22.04.2015, 16:27 10
OpenGoodwin, для работы Invoke() требуется чтобы элемент управления был создан и для окна работал цикл обработки сообщений. Ты очевидно вызываешь метод ru3 слишком "рано" - скорее всего из конструктора. Советую перенести его вызов в обработчик события Load формы.

P.S. Судя по тому что я вижу на скриншоте у тебя несколько функций ruN которые делают по сути одно и тоже. Советую переписать код так чтобы повторений было как можно меньше потому что длинные простыни кода состоящие из copy-paste тяжело поддерживать. Как пример посмотри на еще одно старое обсуждение.
0
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
22.04.2015, 16:34  [ТС] 11
OwenGlendower, я создал несколько методов(а точнее - 9). И вызывал поочерёдно их в потоках в обработчике нажатия на кнопку.

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
Thread PingRU1 = new Thread(ru1);
                    Thread PingRU2 = new Thread(ru2);
                    Thread PingRU3 = new Thread(ru3);
                    Thread PingRU4 = new Thread(ru4);
                    Thread PingRU5 = new Thread(ru5);
                    Thread PingRU6 = new Thread(ru6);
                    Thread PingRU7 = new Thread(ru7);
                    Thread PingRU8 = new Thread(ru8);
                    Thread PingRU9 = new Thread(ru9);
                    //ru1
                    PingRU1.Start();
 
                    //ru2
                    PingRU2.Start();
 
                    //ru3
                    PingRU3.Start();
 
                    //ru4
                    PingRU4.Start();
 
                    //ru5
                    PingRU5.Start();
 
                    //ru6
                    PingRU6.Start();
 
                    //ru7
                    PingRU7.Start();
 
                    //ru8
                    PingRU8.Start();
 
                    //ru9
                    PingRU9.Start();
Сделал это специально для тех случаев, когда один сервер не работает. Получается так, что все сервера уже отправили запрос, получили ответ и готовы выдать значение на экран, но им приходится ждать timeout неработающего сервера.
0
Администратор
Эксперт .NET
17696 / 13823 / 5313
Регистрация: 17.03.2014
Сообщений: 28,340
Записей в блоге: 1
22.04.2015, 17:03 12
Лучший ответ Сообщение было отмечено OpenGoodwin как решение

Решение

OpenGoodwin, это не оправдание для дублирования кода. Методу Thread.Start можно передать параметр который будет передан методу потока. С его помощью можно написать универсальный метод для всех ситуаций. Примерно так:
Поток
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
static void DoPing(object o)
{
    PingData data = (PingData)o;
    try
    {
        Ping ping = new Ping();
        PingReply pingReply = ping.Send(data.Address);
        if (pingReply.RoundtripTime <= 70 && pingReply.RoundtripTime >= 1)
        {
            data.Label.ForeColor = System.Drawing.Color.Green;
        }
        else if (pingReply.RoundtripTime >= 70 && pingReply.RoundtripTime <= 120)
        {
            data.Label.ForeColor = System.Drawing.Color.Orange;
        }
        else if (pingReply.RoundtripTime >= 120)
        {
            data.Label.ForeColor = System.Drawing.Color.Red;
        }
        else if (pingReply.RoundtripTime == 0)
        {
            data.Label.Text = "Сервер умер :)";
        }
        if (pingReply.RoundtripTime != 0)
        {
            data.Label.Text = pingReply.RoundtripTime.ToString();
        }
    }
    catch (PingException)
    {
        data.Label.ForeColor = System.Drawing.Color.Red;
        data.Label.Text = "Ошибка";
    }    
}

Вызов
C#
1
2
3
4
5
new Thread(DoPing).Start(new PingData { Address = "server1", Label = label1 } );
new Thread(DoPing).Start(new PingData { Address = "server2", Label = label2 } );
new Thread(DoPing).Start(new PingData { Address = "server3", Label = label3 } );
new Thread(DoPing).Start(new PingData { Address = "server4", Label = label4 } );
new Thread(DoPing).Start(new PingData { Address = "server5", Label = label5 } );
1
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
22.04.2015, 17:11  [ТС] 13
OwenGlendower, хм, интересно реализовано. Только вот теперь другая проблема. Студия не распознаёт объект PingData. Жалуется на то, что не подключена директива, хотя она включена:

C#
1
Error   6   The type or namespace name 'PingData' could not be found (are you missing a using directive or an assembly reference?)
C#
1
using System.Net.NetworkInformation;
0
Администратор
Эксперт .NET
17696 / 13823 / 5313
Регистрация: 17.03.2014
Сообщений: 28,340
Записей в блоге: 1
22.04.2015, 17:13 14
OpenGoodwin, ой Забыл привести его код:
C#
1
2
3
4
5
class PingData
{
    public string Address;
    public Label Label;
}
0
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
22.04.2015, 17:20  [ТС] 15
OwenGlendower, спасибо ОГРОМНОЕ за то, что помогаете. Добавил инвоки, всё заработало
0
22.04.2015, 17:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2015, 17:20
Помогаю со студенческими работами здесь

Программа выдает значение 1989058103 при вводе 3 вместо 3
Изучаю Си по книге кернигана ритчи.Почему данная программа выдает значение например при вводе 3...

Программа при делении выдает целое значение а не дробное
Задание: Прибор состоит из трех узлов. При включении прибора с вероятностью P1 появляется...

Программа выдает только одно значение при любых значениях xn и xk
program LAB591; uses crt; const t=1e-9; var x,y,c,z,k:extended; xn,xk,h:real; i:word; BEGIN...

При любых значениях n программа выдает одно и то же (не верное) значение
Помогите решить задачу при помощи цикла &quot;for&quot;, затем при определенных значениях n программа должна...

Подвисает мнемосхема на 2-3 секунды
Добрый день! Мнемосхема на АРМ периодически подвисает на 2-3 секунды, затем пропущенные секунды...

Winamp на секунды 3-4 подвисает
кто подскажет, почему winamp на секунды 3-4 подвисает, когда я нажимаю плей? при повторном нажатии...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru