Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

IdIcmpClient&exception


kernel ©   (2006-12-07 19:42:00) 

Доброго времени суток.

Проблема у меня такая: с помощью IdIcmpClient в консольном приложениипингую какой-нибудь хост, и если хост не существует или не доступен, то происходит "вылетание" из моего консольника (exception). Как избежать этого "вылетания"? try, except не помагают. Заранее, спасибо...


kernel   (2006-12-12 16:17:00) [1]

Спасибо, все понял :)


Сергей М.   (2006-12-12 16:04:00) [2]


> except
> RWriteErrorMsgLn(pchar('Error #'+inttostr(GetLastError)+':
>  '+
> SysErrorMessage(GetLastError)));
> Sleep(1000);
> end;


Все связанное с GetLastError() в твоем обработчике Делфи-исключения - что корове седло. Убирай.

И sleep() тоже убирай - не нужен он здесь ни под каким соусом.


Сергей М.   (2006-12-12 16:01:00) [3]


> kernel ©   (12.12.06 15:38) [15]


Не "вылетает", а приложение завершается согласно твоейлогике.

Заключи в try..except тело for-цикла.


kernel   (2006-12-12 15:38:00) [4]


> Я тебя не спрашиваю, что там у тебя что-то там "отображает".
>
> Я спрашиваю, при выполнении какой конкретно строчки твоего
> кода это происходит !
>
> Это строчка - sleep() ? Или какая ?


Само exception происходит при вызове MTPing.Ping(HostsList[HostsListI]);в случае если хост не существует. Далее программа выполняет

RWriteErrorMsgLn(pchar('Error #'+inttostr(GetLastError)+': '+
SysErrorMessage(GetLastError)));
Sleep(1000);

и вылетает.


Сергей М.   (2006-12-12 15:28:00) [5]

Я тебя не спрашиваю, что там у тебя что-то там "отображает".
Я спрашиваю, при выполнении какой конкретнострочки твоего кодаэто происходит !

Это строчка - sleep() ? Или какая ?


kernel   (2006-12-12 15:14:00) [6]


> Что значит "после" ?


Это значит, что отображает "Error #00000 [описание ошибки]" и через секунду вылетает.


Сергей М.   (2006-12-11 10:07:00) [7]


> вылетает он после sleep


Что значит "после" ?


kernel   (2006-12-09 08:02:00) [8]

А может быть из-за того, что приложение пишется на BDS2006? там indy10 :/


kernel   (2006-12-08 18:10:00) [9]

вылетает он после sleep(1000)


Anatoly Podgoretsky   (2006-12-08 11:21:00) [10]

Врет конечно


Сергей М.   (2006-12-08 10:13:00) [11]

т.е. ты утверждаешь, что брейкпойнт

except
RWriteErrorMsgLn(pch ... // <- здесь

не срабатывает ?


kernel   (2006-12-08 09:21:00) [12]

program mping;

{$APPTYPE CONSOLE}

uses
 SysUtils,
 Classes,
 Windows,
 IdIcmpClient,
 IdBaseComponent,
 IdComponent,
 IdRawBase,
 IdRawClient;

type
 TMTPing = class
 procedure ICMPReply(ASender: TComponent; const ReplyStatus: TReplyStatus);
 procedure Ping(Host: string);
 end;

var
i: integer;
ICMP: TIdIcmpClient;
MTPing: TMTPing;
HostsList: TStringList;
HostsListI: cardinal;
p_str_: string;
pc_card_: Cardinal;
hndl: THandle;

procedure RWriteErrorMsgLn(RLine: PChar);
var
tmpstr: string;
begin
SetConsoleTextAttribute(hndl, 12);
tmpstr:=RLine;
CharToOem(PChar(tmpstr), PChar(tmpstr));
Writeln(' '+tmpstr);
SetConsoleTextAttribute(hndl, 7);
end;

procedure TMTPing.ICMPReply(ASender: TComponent; const ReplyStatus: TReplyStatus);
var
 sTime: string;
begin
 if (ReplyStatus.MsRoundTripTime = 0) then
 sTime := '<1'
 else
 sTime := '=';
 Writeln(Format('%d bytes from %s: TTL=%d time%s%d ms',
 [ReplyStatus.BytesReceived,
 ReplyStatus.FromIpAddress,
 ReplyStatus.TimeToLive,
 sTime, ReplyStatus.MsRoundTripTime]));
end;

procedure TMTPing.Ping(Host: string);
begin
 ICMP.OnReply := ICMPReply;
 ICMP.ReceiveTimeout := 1000;
 try
 ICMP.Host := Host;
 for i := 1 to 4 do begin
 ICMP.Ping;
 Sleep(500);
 end;
finally
end;
end;

function FieldClear(s: string):boolean;
var
f_index_:Cardinal;
begin
Result:=True;
for f_index_:=1 to Length(s) do begin
 if (s[f_index_]<>' ')
  and (s[f_index_]<>'')
   then Result:=False;
end;
end;

function StringToStringList(SrcStr: string;
 var DstStrLst: TStringList):boolean;
var
line_i: Cardinal;
line_s:string;
begin
Result:=false;
line_s:='';
if (Length(SrcStr)>0)
and (FieldClear(SrcStr)=false) then begin
 for line_i:=1 to Length(SrcStr) do begin
  if ord(SrcStr[line_i])<>32
   then line_s:=line_s+SrcStr[line_i];
  if ord(SrcStr[line_i])=32 then begin
   if FieldClear(line_s)=false
    then DstStrLst.Add(line_s);
   line_s:='';
   end;
  if line_i=Length(SrcStr) then begin
   if FieldClear(line_s)=false
    then DstStrLst.Add(line_s);
   line_s:='';
   end;
  end;
 Result:=true;
end;
end;

begin
try
p_str_:='';
 hndl:=GetStdHandle(STD_OUTPUT_HANDLE);
 SetConsoleTextAttribute(hndl, 7);
Writeln;
if ParamCount=0 then Halt(0);
if ParamCount>0 then begin
 for pc_card_ := 1 to ParamCount do
  p_str_:=p_str_+ParamStr(pc_card_)+' ';
end else Halt(0);
if FieldClear(p_str_)=true then Halt(0);
HostsList:=TStringList.Create;
HostsList.Clear;
if not StringToStringList(p_str_, HostsList) then Halt(0);
ICMP:=TIdIcmpClient.Create(nil);
for HostsListI := 0 to HostsList.Count - 1 do begin
 Writeln('Host: '+HostsList[HostsListI]);
 Writeln;
 MTPing.Ping(HostsList[HostsListI]);
 Writeln;
end;
ICMP.Free;
HostsList.Free;
Readln;
except
RWriteErrorMsgLn(pchar('Error #'+inttostr(GetLastError)+': '+
SysErrorMessage(GetLastError)));
Sleep(1000);
end;
end.


Сергей М.   (2006-12-08 09:17:00) [13]


> kernel ©   (08.12.06 09:15) [5]


Вот и показывай, как ты доработал этот пример до "консольного" вида


kernel   (2006-12-08 09:15:00) [14]

Это код то же самое, что и в папке [Delphi]\Demos\Indy\PingGUI только в консольном виде.


Сергей М.   (2006-12-08 09:07:00) [15]


> В обычном приложении помогают, а в консольном происходит
> "вылет".


"Обычное" приложение с т.з. механизма обработки исключений ничем не отличается от консольного.

Показывай код ...


kernel   (2006-12-08 06:57:00) [16]


> Ты точно уверен, что try, except не помогают?


В обычном приложении помогают, а в консольном происходит "вылет".


Dmitrij_K   (2006-12-07 22:17:00) [17]


> try, except не помагают.

Очень помогает


Anatoly Podgoretsky   (2006-12-07 20:15:00) [18]

> kernel  (07.12.2006 19:42:00)  [0]

Ты точно уверен, что try, except не помогают?


Наверх

Титульная страница Поиск, карта сайта Написать письмо