Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > C++ Builder
Перезагрузить страницу Возникла проблема пингования превышен интервал ожидания
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
vital_krsk vital_krsk вне форума
Member
 
Сообщений: 34
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.05.2006
По умолчанию Возникла проблема пингования превышен интервал ожидания - 22.06.2006, 14:16

в общем что делаю
есть база с ip адресами и пр.
считываю все это дело в TStringList-ы
...
далее в таймере(раз в секунду) выполняю
Код:
...
if(timer==3600) timer=0;
timer++;
for(iks=0; iks<pinghosts; iks++)
        {
        if(timer%StrToInt(Timeout->Strings[iks])==0)
                {
                IdIcmpClient1->ReceiveTimeout=StrToInt(Timeout->Strings[iks]);
                IdIcmpClient1->Host=IP_adr->Strings[iks];
                try
                        {
                        for(int j=0; j<StrToInt(Packets->Strings[iks]); j++)
                                {
                                IdIcmpClient1->Ping();
                                }
                        }
                catch(EIdSocketError &exeption)
                        {
                        if (Problem->Strings[iks]!="1")
                                {
                                if (Problem->Strings[iks]=="0")
                                        {
                                        hosts_ok--;
                                        hosts_off++;
                                        if (show=="ping")
                                                {
                                            Panel6->Caption=hosts_ok;
                                            Panel8->Caption=hosts_off;
                                                }
                                        if (Message->Strings[iks]=="True")
                                                {
                                                String s=("косяк...");
                                                s+=IP_adr->Strings[iks];
                                                //Memo1->Lines->Add(s);
                                                Application->MessageBox(s.c_str(), "косяк", MB_OK);
                                                }
                                        }
                                if (Problem->Strings[iks]=="2")
                                        {
                                        if (Message->Strings[iks]=="True")
                                                {
                                                говорю типа что косяк -//-                                                }
                                        }
                                if (Problem->Strings[iks]=="3")
                                        {
                                        if (Message->Strings[iks]=="True")
                                                {
                                                -//-}
                                        }
                                Problem->Strings[iks]="1";
                                }
                        }
                }
        }
...
а в обработчике пингования пишу
...
Код:
       String result[5];
        result[0] = IntToStr(AReplyStatus.BytesReceived);                     
        result[1] = AReplyStatus.FromIpAddress;                                         result[2] = IntToStr((int)AReplyStatus.SequenceId);                            result[3] = IntToStr((int)AReplyStatus.TimeToLive);                             result[4] = IntToStr(AReplyStatus.MsRoundTripTime);                     
if(AReplyStatus.ReplyStatusType==2)                                                     {
        if (Problem->Strings[iks]!="2")
                {
                if (Problem->Strings[iks]=="0")
                        {
                        hosts_ok--;
                        hosts_off++;
                        if (show=="ping")
           {
                                Panel6->Caption=hosts_ok;
                                Panel8->Caption=hosts_off;
           }
                        if (Message->Strings[iks]=="True")
                                {
                                -//-}
                        }
                if (Problem->Strings[iks]=="1")
          {
          if (Message->Strings[iks]=="True")
                                {
                                -//-}
                        }
                if (Problem->Strings[iks]=="3")
          {
          if (Message->Strings[iks]=="True")
                                {
                                -//-}
                        }
                Problem->Strings[iks]="2";
  }
        }
if(AReplyStatus.ReplyStatusType==0)                                                               {
        if (StrToInt(result[4])>StrToInt(Delay->Strings[iks]))
  {
                if (Problem->Strings[iks]!="3")
                        {
                        if (Problem->Strings[iks]=="0")
                                {
                                hosts_ok--;
                                hosts_off++;
                                if (show=="ping")
                   {
                                        Panel6->Caption=hosts_ok;
                                        Panel8->Caption=hosts_off;
                   }
                                if (Message->Strings[iks]=="True")
                                        {
                                        -//-}
                                }
                        if (Problem->Strings[iks]=="1")
                  {
                  if (Message->Strings[iks]=="True")
                                        {
                                        -//-}
                  }
                        if (Problem->Strings[iks]=="2")
                  {
                  if (Message->Strings[iks]=="True")
                                        {
                                        -//-}
                                }
                        Problem->Strings[iks]="3";
                        }
  }
        if (Problem->Strings[iks]!="0")
{
                hosts_ok++;
                hosts_off--;
                if (show=="ping")
                        {
                      Panel6->Caption=hosts_ok;
                      Panel8->Caption=hosts_off;
                        }
                Problem->Strings[iks]="0";
                }
...
в общем проблема в чем
при обработке события у меня выводится сообщение на экран и пока я не нажму ок то эта часть кода вроде как не продолжается, а таймер то тикает и в итоге у меня получается куча сообщений и т.п. косяки
далее если я делаю не вывод сообщения а вывод например в мемо, то у меня получается вот что
...
Возникла проблема пингования (превышен интервал ожидания) на адрес - 192.168.178.1
Возникла проблема пингования (превышен интервал ожидания) на адрес - 194.87.0.50
Возникла проблема пингования (превышена максимально допустимая задержка) на адрес - 127.0.0.1
//Это вроде как нормально а дальше не очень...
Возникла проблема пингования (превышена максимально допустимая задержка) на адрес - 192.168.178.1
Возникла проблема пингования (превышен интервал ожидания) на адрес - 192.168.178.1
Возникла проблема пингования (превышена максимально допустимая задержка) на адрес - 192.168.178.1
Возникла проблема пингования (превышен интервал ожидания) на адрес - 192.168.178.1
...
анализ показал что это происходит в за один подход пингования
в одно и тоже время(точность секунды)
алгоритм отрабатывает т.е. Problem->Strings[iks] изменяются, но дело происходит для разных пакетов причем их нумерация не по порядку а в разнобой! количество пакетов не равно количеству всего посланных пакетов

Вопрос - можно ли вывести сообщения так чтобы код продолжал исполняться не дожидаясь нажатия ОК
и что за фигня происходит с пакетами ?
Ответить с цитированием
  (#2 (permalink)) Старый
philosopher philosopher вне форума
Member
 
Сообщений: 97
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.09.2005
По умолчанию 23.06.2006, 07:33

сообщение я так понимаю выводишь типа ShowMessage(),которое выполняется модально... т.е. если хочешь чтоб код продолжался, делай свою формочку с сообщением...
и
стопудово время, которое занимает все твое пингование превосходит период таймера...
грубо говоря останавливай таймер на время пингования... потом опять запускай.
больше добавить нечего...
Ответить с цитированием
  (#3 (permalink)) Старый
Gedeon Gedeon вне форума
Member
 
Сообщений: 631
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.06.2003
По умолчанию 23.06.2006, 17:20

пинги в отедльный поток!
Ответить с цитированием
  (#4 (permalink)) Старый
vital_krsk vital_krsk вне форума
Member
 
Сообщений: 34
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.05.2006
По умолчанию 24.06.2006, 12:51

понятно, про окна и сам думал, и про потоки тоже. А может все вручную написать, типа завести сокеты и т.д.
Ответить с цитированием
  (#5 (permalink)) Старый
vital_krsk vital_krsk вне форума
Member
 
Сообщений: 34
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.05.2006
По умолчанию 25.06.2006, 10:17

В общем посчитал я там и действительно задержка пингования превосходит 1 секунду если отправляется более 500 пакетов.
Подумываю вот что с этим сделать:
можно ограничить число пакетов для одного адреса - однозначно
думаю можно увеличить период таймера - подумаем еще
еще подумываю просчитывать вот что:
1 беру все таймауты для всех пингуемых адресов, далее сортирую их в порядке возрастания, далее убираю все совпадающие и считаю для них Наименьшее Общее Кратное найдя его я считаю максимальное кол-во пакетов посыл в этот момент времени и если оно > 500 то вывожу предупреждение ...типа косяк и все такое...только думаю начинать надо не со всех таймаутов а с 2 и если число пакетов меньше 500 в момент НОК, то беру следующее знач таймаута, а насчет ручного прописания сокетов и т.д. отбросил я это пока т.к. даже не дописав само пингование а только объявив там все у меня размер проги в памяти стал больше...странно...короче не стал доделывать - может кто переубедит.
еще бы хотелось уменьшить размер пакетов (в компоненте он=72 байта), но не знаю пока как - может кто подскажет.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
FataLL FataLL вне форума
Member
 
Аватар для FataLL
 
Сообщений: 1,783
Сказал(а) спасибо: 2
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 04.11.2004
По умолчанию 25.06.2006, 13:06

2 vital_krsk
Тебе же дядька philosopher уже все сказал, что ты выдумываешь себе гимор? В обработчике таймера сделай:
Код:
Timer1->Enabled = false;
// Пингуй, хоть обпингуйся...
Timer1->Enabled = true;
А насчёт НОКов и т.д., ты хоть поделись, чего ты добиваешься и зачем тебе это нужно
Ответить с цитированием
  (#7 (permalink)) Старый
vital_krsk vital_krsk вне форума
Member
 
Сообщений: 34
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.05.2006
По умолчанию 25.06.2006, 13:27

Да вот именно что задумка такая, чтобы проверять доступность устройств с периодом прописанным в базе, для каждого устройства свой период в зависимости от важности самого ус-ва, а минимальный период у меня в проге и в базе =1 секунде, так что если я буду останавливать таймер, то о каком периоде пингования может идти речь??? а момент пингования для каждого устройства я выщитываю как переменную timer(увелич при каждом срабат таймера на 1, при равенстве 3600 приравн 0) поделить на период пинга ус-ва и проверяю остаток на равенство 0. так что останавливать таймер никак, а чтобы все что есть успело пропинговаться за 1 секунду и думаю высчитывать НОКи. может у меня неправильный подход к этому делу так вы мне подскажите? Кстати очень радует оперативность форума и кто-то там из Края был, так что привет родному Красноярску!.
Ответить с цитированием
  (#8 (permalink)) Старый
FataLL FataLL вне форума
Member
 
Аватар для FataLL
 
Сообщений: 1,783
Сказал(а) спасибо: 2
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 04.11.2004
По умолчанию 25.06.2006, 17:01

Второй дядька Gedeon тебе тоже уже сказал, что надо выносить пинги в отдельный поток. Лучше всего даже класс забахать, чтоб 100 раз одно и то же не писать, в которых будут все данные конкретного хоста, а не заводить кучу непонятных стринглистов. Пришло время, запустилось несколько процессов пингования... А таймер идет и продолжает отслеживать, не пора ли еще процессов запустить...

И вообще, странно немного. Откуда такая необходимость раз в секунду знать о сетевом раскладе. Ты что там, локальную сеть управления атомным реактором настраиваешь? Почему нельзя раз в минуту проверить? Или даже в 5 минут? Что меняется? Для чего накапливаются данные? Ну, пусть будет какой-то хост недоступен, ну и что? Программа-клиент сама это может определить, если соединение не пройдет при подключении. Короче, объясняй...
Ответить с цитированием
  (#9 (permalink)) Старый
vital_krsk vital_krsk вне форума
Member
 
Сообщений: 34
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.05.2006
По умолчанию 25.06.2006, 19:06

1)В общем, до того как меня забрали в армию я работал в фирме - оператор связи и у нас там на перле был написан скрипт пингования устройств - маршрутизаторов, серверов, коммутаторов и т.п. фигни.
Работал в службе тех поддержки и моей обязанностью было следить за всей сетью причем задержки восстановлений были критичны - трафик большой - много денег. И нам нужно было об аварии узнать прежде чем клиенты начнут звонить.
В общем писал тот скрипт парень один а потом уволился, я конечно в нем разобрался но передалеть небыло времени - кое-что не устраивало. вот тогда и задумал.
2)Чтобы в армии мозги не усохли программирую себе потихонку
3)Период секунда взял от балды просто точно не помню как там было, но раз в 30 секунд это точно, хотя не помню...
4)Данные пока не сохраняются хотя думаю об этом, просто хотелось бы чтобы результаты пингования можно было-бы увидеть в графическом формате, ну и сам прикол то всего собрать как можно больше статистики и всяких данных и все представить наглядно.
а насчет классов пока не знаю их преимуществ и как их реализовывать, ну если говорите что Рулезз то почитаю завтра.
и Еще пробовал...
Код:
/*DWORD WINAPI ThreadFunc (LPVOID)
        {
        Form1->IdIcmpClient1->Ping();
        return 0;
        }
            */
...
/* DWORD lpThreadId;
    HANDLE hT=CreateThread(NULL, 0, ThreadFunc, NULL, 0, &lpThreadId);
    CloseHandle(hT);    */
и Выдало ошибку при запуске проги, так что пока оставил, до лучших времен
Ответить с цитированием
  (#10 (permalink)) Старый
FataLL FataLL вне форума
Member
 
Аватар для FataLL
 
Сообщений: 1,783
Сказал(а) спасибо: 2
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 04.11.2004
По умолчанию 26.06.2006, 07:58

Интересный подход. Постоянно пингуя всё окружение, ты гонишь такой бестолковый и огромный трафик, что просто ужас. Тем более сам говоришь, что трафик денег стоит. Считаю, что даже при очень интенсивной нагрузке на сеть, информацию о её работоспособности можно собирать раз в несколько минут. А может быть, лучше пускай каждое устройство само о себе докладывает, что оно рабостоспособно? И еще. Зачем тебе собирать задержки? Разве факта работоспособности (т.е., ответ пришел) мало?
Ответить с цитированием
  (#11 (permalink)) Старый
vital_krsk vital_krsk вне форума
Member
 
Сообщений: 34
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.05.2006
По умолчанию 26.06.2006, 14:14

Во первых трафик большой не спорю, но ведь никто не заставляет пинговать все подряд каждую секунду (ведь выбор таймаута от секунды до часа!) так что объем трафика зависит от значений в базе, думаю тот кто будет заполнять её хоть подумает немного о целесообразных значениях.
Во вторых трафик провайдера внутри его сети бесплатный, если что.(А трафик клиентов - это наши деньги)
В третьих насчет того чтобы устройство сообщало - это тема, я об этом думал и это следующее что я буду делать в этой проге - работа по SNMP протоколу, правда пока не знаю как, но информации вроде накачал, так что будем разбираться. Есть ли другие варианты?
В четвертых а как насчет средней задержке в какой-то период времени (кстати это может быть примерным значением таймаута пингования), а если большие задержки есть не всегда а периодически, как тогда это узнать?(было такое кстати, вылетал каждый 25 пакет...)А может нужно узнать колебания средней задержки за сутки или нужно узнать допустимый уровень потерь пакетов и т.п. В общем думаю все-таки стоит собирать данные.
Ответить с цитированием
  (#12 (permalink)) Старый
FataLL FataLL вне форума
Member
 
Аватар для FataLL
 
Сообщений: 1,783
Сказал(а) спасибо: 2
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 04.11.2004
По умолчанию 26.06.2006, 16:43

Можно сделать так. Пишешь класс в котором есть TTimer и IdIcmpClient, делаешь приемлимый интерфейс (типа SetTimeout, SetHost, GetHostData и т.д.). Обработчик таймера внутри класса, естественно. Создаешь массивчик экземпляров класса, и потом в цикле говоришь a[i]->Go(), которая запустит таймер, и всё. Конечно, не совсем корректно разбазаривать ресурс системных таймеров, но я не думаю, что у тебя море устройств
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
vital_krsk vital_krsk вне форума
Member
 
Сообщений: 34
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.05.2006
По умолчанию 27.06.2006, 15:34

В общем насчет классов понятно, вот только как там заводить динамически TTimer и IdIcmpClient и как запихнуть обработчик таймера внутрь класса? И кстати мне тут и подсказали использовать один таймер, а не по одному на устройство, устройств было не сильно много - маршрутизаторов штук 5, каталист, коммутаторы уровня3 - 5 штук, серверов штук 10, да еще пара адресов провайдеров московских, да еще пара левых из инета, да несколько важных модемов и пара пар АТС-ок и еще штук 5 АДСЛ дсламов, и несколько особо важных клиентов, ну и 10 накидываем на развитие к примеру - стоит ли для всех заводить таймеры? Тем более как всегда в России на комп для тестирования сети тратят минимально - пенек 2 примерно, справится ли?
У меня конечно есть пара набросков как уменьшить требования и скорость работы программы, но ...
Ответить с цитированием
  (#14 (permalink)) Старый
vital_krsk vital_krsk вне форума
Member
 
Сообщений: 34
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.05.2006
По умолчанию 27.06.2006, 16:08

И вопрос а может каким нибудь боком использовать библиотеки, а классы в библиотеку можно запихнуть?
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возникла проблема при написание программы senya25 C++ Builder 1 24.01.2012 01:49
Составить пограмму: вывести на экран все натуральные числа кратные 3, интервал от 1 д Михаил505 Pascal 1 31.10.2011 19:31
интервал чисел TimoLLIa Pascal 2 14.10.2011 22:20
Случайное число из отрезка попадающее в интервал turtles Java 1 31.08.2011 14:17
Возникла проблема с работай программы через виртуальный com порт usb BOBAC29 Железо. Написание драйверов 12 01.03.2011 02:43
у меня возникла проблема после переустановки винды Лёся Любые вопросы от новичков 3 16.02.2011 16:09
Интервал между моментами 12-часового цикла Gock C++ Builder 14 08.04.2010 22:59
При ремонте монитора Fujitsu SIMENS CTM5010 возникла проблема с распай Алексей29 Ru Разное 0 06.08.2008 00:04
Возникла проблема с установкой аудио драйвера на ноутбук Asus A9 R2718 Ward Звук 2 13.05.2008 01:12
Возникла проблема с запуском программы на компьютерах, где не установлено BDE usver_old C++ Builder 6 22.02.2007 13:54
Как определить часовой интервал наибольшей интенсивности поступления звонков NemoASPI Вопросы начинающих программистов 0 27.12.2004 00:47
Максимальный интервал таймера. Shura09 Visual Basic 2 27.11.2003 10:59



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов