아래와 같이 클라이언트가 접속 한 후 5분이 지나면 자동으로 접속을 끊도록 구현하려는데요..
아래 루틴이 실행되면 서버의 CPU사용률이 100%로 되는 것 같습니다. 패킷이 오고가는건 되는 것 같습니다만.. 원인과 해결책이 무엇일까요?
별도의 쓰레드를 쓰는 것은 없고요.. 접속하고 패킷 하나 서버로 보내고 그걸로 끝입니다. 패킷을 보내고 접속을 끊어야 하는데, 안끊기는 경우가 간혹 있어서 일정시간이 지나면 서버차원에서 자동으로 접속을 해제하려고 하는거거든요..
접속을 해제할 클라이언트 판별은 접속시 Connection의 Tag에 카운트를 매겨서 구현하고 있습니다.
void __fastcall TWin_Main::Timer_DisconnectTimer(TObject *Sender)
{
DWORD Timer;
TIdContext *lpContext;
if(!Timer_Disconnect->Enabled)
return;
Timer = GetTickCount();
for(int i = 0; i < MAX_PLAYER; i++)
{
if(stPlayer[i].Timer == 0)
continue;
// 타이머 오류 교정
if(Timer < stPlayer[i].Timer)
stPlayer[i].Timer = Timer;
// 시간이 지났다.
if(Timer - stPlayer[i].Timer > DISCONNECT_TIMER)
{
TList *LockList = TCPServer->Contexts->LockList();
for(int j = 0; j < LockList->Count; j++)
{
lpContext = (TIdContext *)(LockList->Items[j]); // get client-object
if(i == lpContext->Connection->Tag)
{
lpContext->Connection->Disconnect();
break;
}
}
}
TCPServer->Contexts->UnlockList();
}
}
|