【发布时间】:2016-06-29 03:06:23
【问题描述】:
(使用 Delphi 2009)我正在尝试使用 Indy TidIcmpClient 编写一个简单的网络连接监视器。这个想法是 ping 一个地址,然后在附加的 TidIcmpClient.OnReply 处理程序中测试返回了多少数据。如果回复包含 > 0 字节,那么我知道连接成功,但如果 TidIcmpClient 超时或回复包含 0 字节,我将假设链接已关闭
我很难理解 TidIcmpClient 的逻辑,因为没有 'OnTimeout' 事件。
两个子问题...
是否无论如何都会调用 TidIcmpClient.OnReply,无论是 (a) 接收到数据时还是 (b) 达到超时时,以先到者为准?
我如何区分由于超时而导致的零字节回复和在超时期限内恰好包含零字节(或不可能发生)的真实回复?
换句话说,这种代码是否可以,或者我需要做其他事情来判断它是否超时
procedure TForm1.IdIcmpClient1Reply(ASender: TComponent; const AReplyStatus: TReplyStatus);
begin
if IdIcmpClient1.ReplyStatus.BytesReceived = 0 then
//we must have timed out, link is down
else
//got some data, connection is up
end;
procedure DoPing;
begin
IdIcmpClient1.ReceiveTimeout := 200;
IdIcmpClient1.Host := '8.8.8.8';
IdIcmpClient1.Ping;
end;
【问题讨论】: