我的S端是C端用来验证的,所以clientsocket连一次就断开了,不会超过5-10秒,但是有人恶意连接我,一下高达几百个连接,并且持续几小时。请教,S端如何做个监视,就是监视所有C端的连接,只要超过10秒,S端就将其断开。来个源码,谢谢

解决方案 »

  1.   

    定义结构体
    type
      client_record=record
        CHandle: integer; //客户端套接字句柄
        CSocket:TCustomWinSocket; //客户端套接字
        CName:string; //客户端计算机名称
        CAddress:string; //客户端计算机IP地址
        CUsed: boolean; //客户端联机标志
        CTime: TDatetime; // 客户端连接时间
    end;
    定义全局变量
    session: array[0..99] of client_record; //客户端连接数组
    Sessions: integer; //客户端连接数procedure TForm1.ServerSocketClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    var 
      i,j:integer;
    begin
      j:=-1;
      for i:=0 to sessions-1 do
      begin
        //在原有的客户端连接数组中有中断的客户端连接
        if not session[i].CUsed then
        begin
          session[i].CHandle := Socket.SocketHandle ;//客户端套接字句柄
          session[i].CSocket := Socket; //客户端套接字
          session[i].CName := Socket.RemoteHost ; //客户端计算机名称
          session[i].CAddress := Socket.RemoteAddress ;//客户端计算机IP
          session[i].CUsed := True; //连接数组当前位置已经占用
          session[i].CTime := now; //连接时间
          Break;
        end;
        j := i;
      end;
      if j=sessions-1 then
      begin
        inc(sessions);
        session[j+1].CHandle := Socket.SocketHandle ;
        session[j+1].CSocket := Socket;
        session[j+1].CName := Socket.RemoteHost ;
        session[j+1].CAddress := Socket.RemoteAddress ;
        session[j+1].CUsed := True;
        session[i].CTime := now; //连接时间
      end;
    end;//Timer1的interval定义为15秒
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      i:integer;
      Present: TDateTime;
      Hour1,Min1, Sec1, MSec1: Word;
      Hour2,Min2, Sec2, MSec2: Word;
      S:word;
    begin
      Timer1.Enabled := false;
      Present := now;
      for i:=0 to sessions-1 do
      begin
        DecodeTime(Present, Hour1, Min1, Sec1, MSec1);
        DecodeTime(session[i].CTime, Hour2, Min2, Sec2, MSec2);
        if Min1>Min2 then
          S := Sec1+60-Sec2
        else if Min1=Min2 then
          S := Sec1-Sec2
        else
        begin
          ShowMessage('出错');
          exit;
        end;    if S>10 then
          session[i].CSocket.Disconnect(0);
      end;
      Timer1.Enabled := true;
    end;