Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.048 c
9-1156496431
B-on
2006-08-25 13:00
2007.07.15
Опять артефакты в OGL


2-1181502728
Golikov
2007-06-10 23:12
2007.07.15
как запустить стандартный просмоторщик изображений и факсов Windo


15-1181886133
Владимирс
2007-06-15 09:42
2007.07.15
"программист разработчик" или "программист-разработчик"


6-1165509778
kernel
2006-12-07 19:42
2007.07.15
IdIcmpClient&amp;exception


15-1181638216
TUser
2007-06-12 12:50
2007.07.15
Чудище





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский