|
아래와 같이 소켓 서버 프로그램을 했는데 메모리가 계속해서 증가합니다.
도데체 이유가 뭔지 궁금합니다.
클라이언트에서는 1초에 한번씩 데이터를 전송합니다.
클라이언트 갯수는 약 20여개 정도 이고요...
이유가 멀까요.... (T.T;;)
서버는 NonBlocking 모드로 설정하였습니다...
//------------------------------------------------------------------
// Header에 선언
TCustomWinSocket *m_ClientSocket[DEF_MAX_SOCKET];
//------------------------------------------------------------------
// 클라이언트로 부터 접속시 처리
//------------------------------------------------------------------
void __fastcall TfrmSocketServer::ServerSocketAccept(TObject *Sender,
TCustomWinSocket *Socket)
{
int n;
// 연결상태 표시
for(n=0; n<frmTermStat->sgrdTermStat->RowCount; n++)
{
if (Trim(frmTermStat->sgrdTermStat->Cells[9][n]) == Trim(Socket->RemoteAddress))
{
if ( mb_connected[n] ) m_ClientSocket[n] = NULL;
m_ClientSocket[n] = Socket;
mb_connected[n] = true;
frmTermStat->sgrdTermStat->Cells[1][n] = DEF_TERM_CONN;
if ( frmTermStat->sgrdTermStat->Cells[3][n] == cboTermName->Items->Strings[cboTermName->ItemIndex])
{
pnlTermStat->Color = clBlue;
pnlTermStat->Font->Color = clWhite;
pnlTermStat->Caption = "통 신 중";
}
}
}
}
/* ============================== END FUNCION ============================== */
//-----------------------------------------------------------------------
// 클라이언트로부터 데이터가 전송되었을경우
//-----------------------------------------------------------------------
void __fastcall TfrmSocketServer::ServerSocketClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
int n, i_totlen, i_recvlen;
char c_tmpdata[2048];
// 어느 단말의 소켓인지를 찾는다.
memset(mc_recvdata, 0, sizeof(mc_recvdata));
for(n=0; n<DEF_MAX_SOCKET; n++)
{
if ( !mb_connected[n] ) continue;
if ( m_ClientSocket[n]->RemoteAddress == Socket->RemoteAddress )
{
i_totlen = Socket->ReceiveLength();
int i_roop_count = 0;
for(;;)
{
if (i_roop_count > 10)
{
// 데이터 이상 처리
break;
}
i_roop_count++;
memset(c_tmpdata, 0, sizeof(c_tmpdata));
try{
i_recvlen = Socket->ReceiveBuf(c_tmpdata, i_totlen);
}
catch(...)
{
AnsiString s_log = "소켓IP=" + Socket->RemoteAddress;
frmCommon->SaveLogFile( DEF_LOG_STAT,
DEF_TERM_PROCESS,
"소켓수신오류",
s_log);
TraceDataDisplay(3, -1, "소켓수신", "ERR", s_log );
}
if ( i_recvlen == -1 ) break;
if ( i_recvlen >= i_totlen )
{
if ( i_recvlen >= sizeof(mc_recvdata) ) i_recvlen = sizeof(mc_recvdata) - 1;
int i_pos = lstrlen(mc_recvdata);
memcpy(&mc_recvdata[i_pos], c_tmpdata, i_recvlen);
// 수신된 데이터 처리
RecvDataManageProcess(n, mc_recvdata);
break;
}
else if ( i_recvlen < i_totlen )
{
i_totlen = i_totlen - i_recvlen;
}
}
return;
}
}
}
/* ============================== END FUNCION ============================== */
|