向设备发出数据后,如何判断并设置网络延时超时 TimeOut!!!!(50分)

  • 主题发起人 主题发起人 Neo_leaf
  • 开始时间 开始时间
N

Neo_leaf

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟用TidUDPServer向一个网络设备发出一段命令后,
但是不知道网络是否连接良好,(如果连接良好,设备会有返回命令!!)
现在,我想写一个东西来判断在一定的时间(如 5秒)内是否有数据返回,
(也就是在这段时间内不断的扫描一个端口,检查是否有数据。)
如果没有,则打印“连接超时!!”,
请问这样的函数该如何写,最好用API函数,
 
个人觉得未必需要那么复杂。你放置一个定时器,在你发送命令以后,设置开始计时时间,不断检测是不是有数据回来。如果超过你规定的5秒钟还没有数据回来,认为超时。当然,你需要设置一个公共变量来作为标志,当有数据返回的时候,对该变量进行设置。
或者你使用一个循环,

procedure rrr:boolean;
var b1:TDateTime;
begin
b1:=now;
repeat
Application.ProcessMessages;
if 信息已经返回 then begin rrr:=OK;exit;end;
until now>=IncSecond(b1,5);
ShowMessage('超时');
end;
 
procedure TestConnectUDPRead(Sender: TObject;
AData: TStream; ABinding: TIdSocketHandle);
var
sErr : string;
begin
StreamToBytes(AData,ArrRet);

if(GetErrorCode(ArrRet)<>0)then
begin
sErr := IntToStr(GetCmdType(ArrRet))+':'+IntToStr(GetErrorCode(ArrRet));
Mm_Msg.Lines.Add('Any error was occured! '+sErr);
end;
case GetCmdType(ArrRet) of
5:begin
UDPSendCommand(UDPServer,lvDevice.Selected.SubItems.Strings[5],
StrToInt(lvDevice.Selected.SubItems.Strings[6]),
UDP_CheckAdmin(DevID,SerialNo,sAdminCode),sErr);
///--------------------------------------(1)
Mm_Msg.Lines.Add('Connect Device Success!');
end;
6:begin
Mm_Msg.Lines.Add('Disconnect Device Success!');
exit;
end;
7:begin
UDPSendCommand(UDPServer,lvDevice.Selected.SubItems.Strings[5],
StrToInt(lvDevice.Selected.SubItems.Strings[6]),
UDP_DisConnect(DevID,SerialNo),sErr);
///--------------------------------------(2)
Mm_Msg.Lines.Add('Check AdminCode Success!');
end;
end;
end;
我是这样做的,
在接受返回数据的事件里也做发命令,
俺现在想在1、2 处加判断超时语句,
你刚才说的意思我懂,但是,最关键的没有说出来,那就是如何监听一个端口有没有数据返回???!!!
分少可以加,麻烦大家了,
多谢。。。
 
简单啊,定义一个公共变量,在发出命令后马上进行设置,比如是OK_flag.
我们可以使用这样的流程。


//命令发送
sendcommand(....);
OK_Flag:=false;

//超时判断过程
check_timeout;
if OK_flag=True then exit;//已经有数据回来,退出超时判断循环


//端口监听过程。
list_procudre ;
begin
触发本过程,对标识进行设置。
OK_flag:=true;//有数据回来。
end;
 
多谢zywcd大哥,
揭帖了,
 
后退
顶部