Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Ping из библиотеки ics


Автор: Drizhenko 2.11.2005, 09:01
Когда я использую компонент Ping из библиотеки ics, то при при при пинговании хоста ответ приходит быстро, однако если возникает ошибка "превышен интервал ожидания", то программа ждет ответа от хоста и начинает тормозить. Как сделать, чтобы при ошибке она просто посылала следующие запрос, а не ждала три секунды ответа на потеряный пакет?

Автор: RA 13.11.2005, 21:56
покажи код программы, желательно весь.

Автор: Drizhenko 14.11.2005, 09:58
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XPMan, Ping, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Button1: TButton;
    Button3: TButton;
    Edit2: TEdit;
    Edit1: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    XPManifest1: TXPManifest;
    Timer1: TTimer;
    RichEdit1: TRichEdit;
    Ping1: TPing;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    RichEdit: TRichEdit;
    Button5: TButton;
    ProgressBar1: TProgressBar;
    Button2: TButton;
    procedure Button4Click(Sender: TObject);
    procedure Ping1DnsLookupDone(Sender: TObject; Error: Word);
    procedure Ping1EchoReply(Sender, Icmp: TObject; Error: Integer);
    procedure Ping1EchoRequest(Sender, Icmp: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
 

  private
    { Private declarations }
  public
    procedure MyProc(c:Tcolor);
    { Public declarations }
  end;

var
  Form1: TForm1;
  i,j,start,kp,pp,k,h:integer; //kp-êîë. îòðïð. ïàêåòîâ, pp-ïîòåðÿííûõ ïàêåòîâ
  p: TPoint;


implementation

{$R *.dfm}

procedure TForm1.Button4Click(Sender: TObject);
begin
pp:=0;
kp:=0;
start:=1;
j:=0;                 
RichEdit1.Clear ;
label6.Caption :='0,0% ïîòåðü';
richEdit1.SetFocus;
RichEdit1.Lines.Add('Ïîèñê'''+ Edit1.Text +'''');
MyProc(clblack);
ping1.Size:=strToInt(edit2.Text );
ping1.DnsLookup(edit1.Text);
//ping1.Timeout:=StrToInt(edit3.Text);
timer1.Interval:= StrToInt(edit3.Text);

end;

procedure TForm1.Ping1DnsLookupDone(Sender: TObject; Error: Word);
begin
//åñëè ïðîèçîøëà îøèáêà, òî...
if error <>0 then
begin
//âûâåñòè ñîîáùåíèå îá îøèáêå
RichEdit1.Lines.Add('Õîñò íå íàéäåí'''+ Edit1.Text + '''');
MyProc(clblack);
//âûõîä
exit;
end;
//åñëè îøèáîê íå áûëî, òî âûâîäèì â Richedit1 ðåçóëüòàòû ïîèñêà
RichEdit1.Lines.Add('Õîñò '''+ Edit1.text + ''' - '+ping1.DnsResult );
MyProc(clblack);
//óñòîíàâëèâàåì ñâîéñòâî Address êîìïîíåíòà Ping ðàâíûì
//àäðåñó, íàéäåííîìó â áàçå DNS
Ping1.address:= ping1.dnsresult;
//çàïóñêàåì Ping
Timer1.Enabled := true;

end;

procedure TForm1.Ping1EchoReply(Sender, Icmp: TObject; Error: Integer);
  begin
    if error = 0 then
      begin
      RichEdit1.Lines.Add('Íå ìîãó âûïîëíèòü îïåðàöèþ Ping: '+Ping1.ErrorString );
        MyProc(clred);
        pp:=pp+1;
        label5.Caption:='Ïîòåðÿíî: '+inttostr(pp);
      end;
  if error <> 0 then
  begin
     RichEdit1.Lines.Add('Ïîëó÷åíî '+ IntTostr(Ping1.Reply.DataSize)+
    ' áàéò îò '+ping1.HostIP + ' çà ' + intToStr(Ping1.Reply.RTT) + ' ìèëëèñåêóíä');
//     MyProc(StrToInt('$'+'ff0000'));
       MyProc(clblack);
end;
  end;

procedure TForm1.Ping1EchoRequest(Sender, Icmp: TObject);
  begin
    if start= 1 then
    begin
      RichEdit1.Lines.Add('Îòïðàâëåíî' + intTostr(Ping1.Size) + ' áàéòîâ íà ' + Ping1.HostName );
      MyProc(clblack);
      start:=0;
    end;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
start:=0;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
    ping1.ping;
    kp:=kp+1;
    label4.Caption:='Îòïðàâëåíî ïàêåòîâ: '+inttostr(kp);
if (pp*100)/kp<1 then
  begin
    label6.Caption :=Format('%.1f',[(pp*100)/kp])+'%'+' ïîòåðü';
  end
else
    label6.Caption :=IntToStr(round((pp*100)/kp))+'%'+' ïîòåðü';
  end;

procedure TForm1.Button3Click(Sender: TObject);
begin
    Timer1.Enabled := false;
    edit1.SetFocus;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  ip:PAnsiChar;
begin
  ip:=PAnsiChar('ping '+edit1.Text+' -t'+' -l '+edit2.Text+' -w '+edit3.Text);
  WinExec(ip,SW_SHOW);
end;

end.

Автор: RA 14.11.2005, 14:33
Посмотри этот многопоточный пример использования ICS-совского пинга. (Быстро и без тормозов):

Автор: Drizhenko 15.11.2005, 05:47
Почему то при запуске программы возникает ошибка
[Fatal Error] PingThrd.pas(20): File not found: 'Icmp.dcu'
Видимо файла не хватает. Отправь, пожалуйста.

Автор: RA 15.11.2005, 13:11
Drizhenko Вобще-то если ты установил ICS то модуль icmp.pas у тебя должен быть, ибо это не какой-то сторонний модуль а ics-совский.

Находится в папке по адресу "ics\Delphi\Vc32\icmp.pas".

Если что обнови компоненты www.overbyte.be


Автор: alexj 2.3.2006, 22:43
smile работает!

Автор: Zugenoid 7.4.2009, 22:45
Цитата(RA @  14.11.2005,  14:33 Найти цитируемый пост)
Присоединённый файл ( Кол-во скачиваний: 70 )
 ThreadedPingDemo.rar 6,08 Kb

Ребята, я жутко извиняюсь, но я хоть и не гость, но скачатб сие файло у мя не получается. У кого завалялось в запасниках, скиньте мне плз на [email protected], буду должен 100-граммовку коньяку типа "Ночи Херсонеса".

Автор: MetalFan 8.4.2009, 08:47
Zugenoid, пример качается. только код там спорный)

Автор: RA 8.4.2009, 09:51
Цитата(MetalFan @  8.4.2009,  08:47 Найти цитируемый пост)
ример качается. только код там спорный) 


Он устаревший, те. для ICS V5 кажется.

Автор: MetalFan 8.4.2009, 13:08
RA, не только устаревший, но и местами бессмысленный.

Автор: Zugenoid 8.4.2009, 22:21
ребята, вы не поняли-я пытаюсь скачать rar, а скачивается htm-страница, в которой написано, что данная возможность типа не доступна для гостей. вот я о чем. и мне код уже почти этот и не нужен, разобрался и так smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)