Возникла проблема пингования
есть база с 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] изменяются, но дело происходит для разных пакетов причем их нумерация не по порядку а в разнобой! количество пакетов не равно количеству всего посланных пакетов
Вопрос - можно ли вывести сообщения так чтобы код продолжал исполняться не дожидаясь нажатия ОК
и что за фигня происходит с пакетами ?
Хороший такой вопрос.
192.168.178.1 прыжок- 0->2 пакет-0 время- 21:20:37
194.87.0.50 прыжок- 0->2 пакет-0 время- 21:20:43 //Это нормально, а дальше...
192.168.178.1 прыжок- 2->3 пакет-3688 время- 21:20:47// что за номер пакета??? как он может перейти в сост 3 если адрес реально недоступен и должно всегда давать превышен интервал ожидания???
192.168.178.1 прыжок- 3->2 пакет-0 время- 21:20:47//что за пакет опять?? короче ничего не понимаю
192.168.178.1 прыжок- 2->3 пакет-3703 время- 21:20:47
192.168.178.1 прыжок- 3->2 пакет-0 время- 21:20:47
короче либо компонент возвращает непонятно что, либо алгоритм неправильный, а что значит хороший вопрос?
в общем остался только вопрос про вывод сообщения как сделать чтобы после вывода сообщ, код продолжался не дожидаясь реакции пользователя?
А про "ок" --- опять таки не используй MessageBox --- сделай что-нибедь другое. Почему бы как раньше Memo не оставить, ну или "плоди" собственные окошки (экземпляры форм) типа MessageBox-ов, т.к. по сути MessageBox (как сам видишь) - это функция, не возвращающая до тех пор, пока не нажмешь кнопку.
У меня еще вопрос как вы думаете а не будет ли быстрее програ работать если я не буду использовать компонент а напишу все это дело вручную создавая сокеты и т.д. думаю при этом пропадет ошибка обработки результатов??? да и там можно будет думаю устанавливать размер пакета, а то там нельзя было?
А это как --- не в потоках? Компоненты (builder-а сетевые:ClientSocket, etc.) все равно на потоках основаны, а задержка потока и приводит к таким чудесам. Не уверен (необходимо ли это для компанентов), но попробуй выводить в форму через Synchronize() --- должно полегчать.
P.S.: о MessageBox-е --- дело не в функции, конечно --- окошко модальное.
Подумываю вот что с этим сделать:
можно ограничить число пакетов для одного адреса - однозначно
думаю можно увеличить период таймера - подумаем еще
еще подумываю просчитывать вот что:
1 беру все таймауты для всех пингуемых адресов, далее сортирую их в порядке возрастания, далее убираю все совпадающие и считаю для них Наименьшее Общее Кратное найдя его я считаю максимальное кол-во пакетов посыл в этот момент времени и если оно > 500 то вывожу предупреждение ...типа возможны косяки и все такое...только думаю начинать надо не со всех таймаутов а с 2 и если число пакетов меньше 500 в момент НОК, то беру следующее знач таймаута, а насчет ручного прописания сокетов и т.д. отбросил я это пока т.к. даже не дописав само пингование а только объявив там все у меня размер проги в памяти стал больше...странно...короче не стал доделывать - может кто переубедит.
еще бы хотелось уменьшить размер пакетов (в компоненте он=72 байта), но не знаю пока как - может кто подскажет.
А в форму я не вывожу я только если изменяется состояние, да еще возможно в БД буду это записывать незнаю. И что такое Synchronize() не знаю, ладно позже посмотрю.Спасибо за ответы