Non-echo response是怎么回事?急!(200分)

  • 主题发起人 主题发起人 Hjg
  • 开始时间 开始时间
H

Hjg

Unregistered / Unconfirmed
GUEST, unregistred user!
我用D7自带的Indy控件里面的ICMPClient写了一个很简单的ping程序。从数据库中获取一系列IP地址,ping他们,看是否通
Procedure ButonClick(...)
var
str:string;
begin
Table1.First;
While not Table1.eofdo
begin
IdIcmpClient1.Host := Table1.fileds.filesbyname('ip').asstring;
str:= table1.fileds.fieldbyname('bh');
//ip地址的编号,固定2位
IdIcmpClient1.Ping(str);
end;
end;

Procedure IdIcmpClientReply(....);
var
str: string;
begin
if AReplyStatus.ReplaystatusType = rsEcho then
begin
str := LeftStr(IdIcmpClient1.ReplayData,2);
//截取返回数据前两位,写到Memo1中,就知道通不通了
Memo1.Lines.Add(Str+#13);
end;
end;

有的结果能返回来,可是没ping几个,就出现一个Non-echo response Received的异常,程序就中断了!
想用ICS的ping试验一下,但好像它的ping 不能送一个字符串过去
高手们快帮帮忙!
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Mask, Buttons, ExtCtrls, IdBaseComponent, IdComponent,
IdRawBase, IdRawClient, IdIcmpClient, Menus;
type
TForm1 = class(TForm)
Memo1: TMemo;
Panel1: TPanel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Edit1: TEdit;
Label1: TLabel;
Timer1: TTimer;
IdIcmpClient1: TIdIcmpClient;
procedure BitBtn1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure IdIcmpClient1Reply(ASender: TComponent;
const AReplyStatus: TReplyStatus);
procedure BitBtn2Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject;
var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if Timer1.Enabled then
begin
BitBtn1.Caption:='开始检查';
Timer1.Enabled:=False;
// PopupMenu1.Items.Add();
end
else
begin
BitBtn1.Caption:='关闭检查';
Timer1.Enabled:=True;;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
IdIcmpClient1.Host:=Edit1.Text;
IdIcmpClient1.ReceiveTimeout:=1000;
IdIcmpClient1.Ping;
Application.ProcessMessages;
end;

procedure TForm1.IdIcmpClient1Reply(ASender: TComponent;
const AReplyStatus: TReplyStatus);
var sTime:String;
begin
if AReplyStatus.MsRoundTripTime=0 then
sTime:='<1'
else
sTime:='=';
Memo1.Lines.Add(
'从 '+Edit1.Text+' 收回: '+' 字节数= '+IntToStr(AReplyStatus.BytesReceived)+
' 时间'+sTime+IntToStr(AReplyStatus.MsRoundTripTime)+' 回路时间='+IntToStr(AReplyStatus.TimeToLive));
Memo1.Lines.Add('');
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Memo1.Clear;
end;


procedure TForm1.Edit1KeyPress(Sender: TObject;
var Key: Char);
begin
if Key=#13 then
begin
if Edit1.Text='' then
ShowMessage('IP不能为空')
else
BitBtn1.OnClick(Self);
end;
end;

end.

这是我写的一段Ping程序代码.看一下就明白了.
 
to yuzhizhi
您的程序和我的就差在Application.ProcessMessages 这一句上
但我加上后,还是会弹出那个异常消息
您试验过持续ping多个ip吗?
我的单独ping一个ip也没有问题
 
我用异常处理解决了
谢谢你的回复
以后多交流
 
相互学习.
:)
 
后退
顶部