服务器每30秒发一个心跳包,我要怎么样去判断接收的包呢,超过30秒没接收到就认为断线,在read中怎么样和timer控件结合来判断好呢,高手指点。
解决方案 »
- 杯具啊,这个老兄也太倒霉了,两次大地震都让他遇到了
- 一个特弱的动态链接库调用问题
- ado+access
- 报表版本??????
- 菜鸟小问
- "error creating cursor handle"大家帮我看看,怎么会有这个错误?请指正。
- ddgvdfv
- 我收到了visual转发Kronus(Kronus)的Requirement Spec非常感谢Visual。我还想问问,那位大虾有没有实际的需求分析书例子,能让我们学习学习。
- 别人回答对了,我如何给分?如何确定该问题已解决?
- 请问如何在pagecontrol上新建一个Tabsheet??
- 如何把数字3 fromat 成003?
- udpsocket控件如何通过局域网实现两台电脑的SQL数据库的实时传输\更新?
SndHeartMesg();
}
......
if ( SndReqOut() ) {
close(sock); sleep ( 2 ); exit ( -1 );
}
......
if ( GetReqEcho() ) {
close(sock); sleep ( 2 ); exit ( -1 );
}GetReqEcho()
{
while ( !strncmp(MesStr[2],"HBHB",4) ) {
....
}
....
}
为保持长久连接,客户端可以一直向服务端发心跳包。如果确实是单向的,起个循环来读取:while ( !strncmp(MesStr[2],"HBHB",4) ) {
GetOneReq();
ReadFrmSocket(MesStr[2], HbTime);
......
}
如果硬要这样处理可以考虑一下这样:
设置Timer1.Intarval:=1000; //1秒
当read的时候Timer1.Tag:=0;
然后OnTimer事件里面可以这样写
Timer1.Tag:=Timer1.Tag+1;
if Timer1.Tag>=30 then 断了~~~
Form1: TForm1;
ServerCount,ClientCount:integer;implementation{$R *.dfm}procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
begin
ServerCount:=ServerCount+1;
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
ClientCount:=ClientCount+1;
if ClientCount > ServerCount+1 then Showmessage('线路故障!');
end;
然后OnTimer事件里面可以这样写
Timer1.Tag:=Timer1.Tag+1;
if Timer1.Tag>=30 then 断了~~~当read后timer1.tag:=0;但在记时器里它不归零的啊