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 로 바꿔놓았습니다(스레드를 재사용한다고 해서)
혹시나 제가 빠트린 부분이 있다던지 왜 뻣어 버리는지 고수님들의 조언이 궁금합니다
감사합니다