Q&A

  • [질문] 인디 서버를 구성했는데 다운되는 현상이 발생합니다..
procedure TServerF.ReceiveExecute(AThread: TIdPeerThread);
var CommBlock_Start  : TCommBlock_Start;
     vQry : String;
    i , j , Cnt ,vCount : Integer;
    Buffer : Byte;
    Total_Buffer : Array [1..3500] Of Byte;
    Send_Buffer  : Array Of Byte;
    T_Position   : String;
    Temp         : AnsiString;

begin

    If Not AThread.Terminated And AThread.Connection.Connected Then Begin

        Try
            // 넘어오는 자료에서 총길이를 구하기 위해서 처음 4바이트만 버퍼에서 구해온다
            AThread.Connection.ReadBuffer(CommBlock_Start, SizeOf(CommBlock_Start));

            // 총 길이를 구해야 하는데 헤더 정보에는 길이 바이트인 4바이트가 제외되어서 넘어오기때문에 + 4를 해준다
            vCount := StrToInt((Copy(Wide_StringtoHex(CommBlock_Start.Msg[1],2),2,1)
                               +Copy(Wide_StringtoHex(CommBlock_Start.Msg[2],2),2,1)
                               +Copy(Wide_StringtoHex(CommBlock_Start.Msg[3],2),2,1)
                               +Copy(Wide_StringtoHex(CommBlock_Start.Msg[4],2),2,1))) +4;

            If Wide_StringtoHex(CommBlock_Start.Msg[5],2) = '4C' Then
                T_Position := 'L'
            Else If Wide_StringtoHex(CommBlock_Start.Msg[5],2) = '46' Then
                T_Position := 'F'
            Else If Wide_StringtoHex(CommBlock_Start.Msg[5],2) = '4D' Then
                T_Position := 'M';


            Total_Buffer[1] := CommBlock_Start.Msg[1];
            Total_Buffer[2] := CommBlock_Start.Msg[2];
            Total_Buffer[3] := CommBlock_Start.Msg[3];
            Total_Buffer[4] := CommBlock_Start.Msg[4];
            Total_Buffer[5] := CommBlock_Start.Msg[5];

            Cnt := 6;

            //처음 4바이트 이후부터 총길이 까지 임시 버퍼에 저장한다.
            For j := 6 To vCount Do Begin
                AThread.Connection.ReadBuffer(Buffer, SizeOf(Buffer));
                Total_Buffer[Cnt] := Buffer;
                inc(Cnt);
            End;


            Temp := '';

            // 전송할 동적 배열을 선언한다.
            SetLength(Send_Buffer, vCount);

            For i := 1 To vCount Do Begin
                Temp := Temp + Wide_StringtoHex(Total_Buffer[i],2);
                Send_Buffer[i-1] := Total_Buffer[i];
            End;


            vQry := 'Insert into SENDDATA values ('''+FormatDateTime('yyyy-mm-dd hh:nn:ss', Now)+''', '''+Temp+''') ';
            dm.ADOQuery1.SQL.Clear;
            dm.ADOQuery1.SQL.Text := vQry;
            dm.ADOQuery1.ExecSQL;


            Try
                //TIdHTTP 로 구성함..
                SerSend.WriteBuffer(Send_Buffer[0], Length(Send_Buffer), true);
                MsgWrite(MemoSend, 'Server 로 송신성공');
            Except
                MsgWrite(MemoSend, 'Server 로 송신실패 );
            End;

            FillChar(Total_Buffer, Sizeof(Total_Buffer), #0);
            SetLength(Send_Buffer, 0);

            If T_Position = 'L' Then  // 1024 바이트가 넘는경우 마지막 부분인 L 코드가 넘어오면 쓰레드를 종료한다
                AThread.Terminate;

        Except
            MsgWrite(MemoMDT, 'Data 수신실패');
            FillChar(Total_Buffer, Sizeof(Total_Buffer), #0);
            SetLength(Send_Buffer, 0);
            AThread.Terminate;
        End;
  end;

end;


procedure TServerF.ReceiveDisconnect(AThread: TIdPeerThread);
begin
    AThread.Data := nil;
end;


대충 코드는 위와같이 구성했는데 처음에는
IdTCPServer1 에 ThreadMgr은 IdThreadMgrDefault1 를 사용했는데 서버 운용중에 2번이나 cpu 사용율이 90% 이상 올라가다가 뻣어버린 일이 발생했습니다

그래서 IdThreadMgrPool1 로 바꿔놓았습니다(스레드를 재사용한다고 해서)

혹시나 제가 빠트린 부분이 있다던지 왜 뻣어 버리는지 고수님들의 조언이 궁금합니다
감사합니다
0  COMMENTS