Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.15;
Скачать: CL | DM;

Вниз

IdIcmpClient&exception   Найти похожие ветки 

 
kernel ©   (2006-12-07 19:42) [0]

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

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


 
Anatoly Podgoretsky ©   (2006-12-07 20:15) [1]

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

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


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


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

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


 
kernel ©   (2006-12-08 06:57) [3]


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


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


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


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


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

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


 
kernel ©   (2006-12-08 09:15) [5]

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


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


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


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


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

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 10:13) [8]

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

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

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


 
Anatoly Podgoretsky ©   (2006-12-08 11:21) [9]

Врет конечно


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

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


 
kernel ©   (2006-12-09 08:02) [11]

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


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


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


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


 
kernel ©   (2006-12-12 15:14) [13]


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


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


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

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

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


 
kernel ©   (2006-12-12 15:38) [15]


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


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

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

и вылетает.


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


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


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

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


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


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


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

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


 
kernel ©   (2006-12-12 16:17) [18]

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



Страницы: 1 вся ветка

Текущий архив: 2007.07.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
2-1182530106
nord489
2007-06-22 20:35
2007.07.15
OpenDialog


2-1182332495
Новичек
2007-06-20 13:41
2007.07.15
Возвращаемое значение.


15-1181897483
Kolan
2007-06-15 12:51
2007.07.15
Программа для проверки грамматики в коде.


15-1181913417
VID
2007-06-15 17:16
2007.07.15
Помогите найти книгу по JBoss на русском.. плЫз


1-1178875351
VladkoRUS
2007-05-11 13:22
2007.07.15
LIBRARY под Kylix и FreePascal