服务器每30秒发一个心跳包,我要怎么样去判断接收的包呢,超过30秒没接收到就认为断线,在read中怎么样和timer控件结合来判断好呢,高手指点。

解决方案 »

  1.   

    while ( GetOneReq(ReqId, &type, HbTime) < 0 ) {
      SndHeartMesg();
    }
    ......
    if ( SndReqOut() ) {
      close(sock); sleep ( 2 ); exit ( -1 );
    }  
    ......
    if ( GetReqEcho() ) {
      close(sock); sleep ( 2 ); exit ( -1 );
    }GetReqEcho()
    {
      while ( !strncmp(MesStr[2],"HBHB",4) ) {
        ....
      }
      ....
    }
      

  2.   

    一般心跳包都是双向的,服务器发过来的心跳包你只要都出过滤掉就行了。
    为保持长久连接,客户端可以一直向服务端发心跳包。如果确实是单向的,起个循环来读取:while ( !strncmp(MesStr[2],"HBHB",4) ) {
      GetOneReq();
      ReadFrmSocket(MesStr[2], HbTime);
      ......
    }
      

  3.   

    感觉上思路有点问题~~~
    如果硬要这样处理可以考虑一下这样:
    设置Timer1.Intarval:=1000; //1秒
    当read的时候Timer1.Tag:=0;
    然后OnTimer事件里面可以这样写
    Timer1.Tag:=Timer1.Tag+1;
    if Timer1.Tag>=30 then 断了~~~
      

  4.   

    var
      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;
      

  5.   

    当read的时候Timer1.Tag:=0;
    然后OnTimer事件里面可以这样写
    Timer1.Tag:=Timer1.Tag+1;
    if Timer1.Tag>=30 then 断了~~~当read后timer1.tag:=0;但在记时器里它不归零的啊