在用ServerSocket连接了多台ClientSocket后,但有时有些机器死机或不正常掉网了,ServerSocket的ServerSocket1.Socket.Connections[i]中的i是否还会按原形排列吗?假设原有的连接是的i=0、1、2、3。那么当1死机了,那后面的2和3是升上来变成1、2还是保持原来2、3不变.各位能否解答一下,谢谢

解决方案 »

  1.   

    当1死机,ServerSocket会触发错误事件,而ServerSocket.Socket.Connections也会将错误的联接除去.
      

  2.   

    回上贴:这是没错,但SERVERSOCKET只会在第二次和CLIENT连接时才会去判断CLIENT是否在线.这里有时间差.
    所以还是有问题的.
      

  3.   

    var
      i:integer;
    begin
      for i:=0 to ServerSocket1.Socket.Connections.count-1 do
        ServerSocket1.Socket.SendText('...');
    end;
    这样就可以了,它会自动清除不正常连接
      

  4.   

    以下是我常用的代码,希望对楼主有帮助TSocketStatusGroup = record
                    LastVisitTime: TDateTime;
                    SocketHandle: Integer;
                    Enabled: Boolean;
                    Buf: string;
            end;FClientStatus: array [TSocketGroupRange] of TSocketStatusGroup;procedure TCRLSocket_S.MyServerOnConnect(Sender: TObject; Socket: TCustomWinSocket);
    var
            I: integer;
    begin
            for I := Low(TSocketGroupRange) to High(TSocketGroupRange) do
                    if not FClientStatus[I].Enabled then
                    begin
                            FClientStatus[I].LastVisitTime := now;
                            FClientStatus[I].SocketHandle := Socket.SocketHandle;
                            FClientStatus[I].Enabled := True;
                            Break;
                    end;
    end;procedure TCRLSocket_S.MyServerOnDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    var
            I: integer;
    begin
            I := GetClientStatusOffset(Socket.SocketHandle);
            FClientStatus[I].Enabled := False;
    end;function TCRLSocket_S.GetClientStatusOffset(const SocketHandle: integer): integer;
    var
            I: integer;
    begin
            Result := 0;
            For I := Low(TSocketGroupRange) to High(TSocketGroupRange) do
                    if FClientStatus[I].Enabled and (FClientStatus[I].SocketHandle = SocketHandle) then
                    begin
                            Result := I;
                            Break;
                    end;
    end;procedure TCRLSocket_S.CheckSocketStatus;
    var
            I: integer;
    begin
            for I := Low(TSocketGroupRange) to High(TSocketGroupRange) do
                    if FClientStatus[I].Enabled and (SecondsBetween(FClientStatus[I].LastVisitTime, now) > SendBufTimeOut) then
                            CloseConnection(FClientStatus[I].SocketHandle);end;procedure TCRLSocket_S.CloseConnection(const SocketHandle: integer);
    var
            I: integer;
    begin
            I := GetSocketHandleOffset(SocketHandle);
            if I >= 0 then FServerSocket.Socket.Connections[I].Close;        I := GetClientStatusOffset(SocketHandle);
            if I > 0 then FClientStatus[I].Enabled := False;
    end;楼主组织一下,问题就迎刃而解了
      

  5.   

    to  borgvardt(maximius) 大哥:
    这个TSocketGroupRange变量是什么类型的,应该怎样声明呢?我不太会,能否请你再讲一下,谢谢
      

  6.   

    如果是indy,怎么清除tcp无用连接呢
      

  7.   

    隔一定时间,判断是否有长时间无操作的连接,然后判断连接是否无效.
    当1死机,ServerSocket不一定会触发错误事件的
      

  8.   

    to  mxj2000(小马(QQ 25604698 主页 www.wyx2008.com/mxj)) 
    用什么方法才判断用户长时间无操作呢?是用记录该用户上次的操作时间与现在操作时间来比较吗?这样好象不太准确吧!如果用户刚好在规定时间过了有操作那岂不是连不上了。还有想请教一下,户长时间不操作是不是会自动掉线的。
      

  9.   

    设置socket server的inactive timeout值,多少时间不活动后断开连接