Текущий архив: 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.49 MB
Время: 0.03 c