ChattingServer
[ChattingServer] WorkerThreadProc
program-yam
2025. 6. 2. 18:05
IOCP에서 사용하는 WorkerThread를 구현했다.
기본적으로 GQCS( GetQueuedCompletionStatus )가 return 되기를 대기하고, return된 값에 따라 처리한다.
return 된 값이 0일 경우 fin 을 받은 것이므로 종료 처리하고, 0보다 클 경우 적절하게 recv 또는 send 처리한다.
unsigned __stdcall CoreNetwork::WorkerThreadProc(void* argument)
{
CoreNetwork* instance = (CoreNetwork*)argument;
if (instance != nullptr)
{
Session* completeSession = nullptr;
while (1)
{
DWORD transferred = 0;
OVERLAPPED* myOverlapped = nullptr;
int completeRet;
DWORD GQCSError;
do
{
completeRet = GetQueuedCompletionStatus(instance->_HCP, &transferred,
(PULONG_PTR)&completeSession, (LPOVERLAPPED*)&myOverlapped, INFINITE);
if (myOverlapped == nullptr)
{
GQCSError = WSAGetLastError();
wcout << L"MyOverlapped NULL " << GQCSError << endl;
return -1;
}
// transferred가 0이라면 fin 패킷을 받은것이므로 종료처리한다.
if (transferred == 0)
{
break;
}
// 전달받은 overlapped가 recvOverlapped라면 recv 완료 처리를 진행한다.
if (myOverlapped == &completeSession->recvOverlapped)
{
instance->RecvComplete(completeSession, transferred);
}
// 전달받은 overlapped가 sendOverlapped라면 send 완료 처리를 진행한다.
else if (myOverlapped == &completeSession->sendOverlapped)
{
instance->SendComplete(completeSession);
}
} while (0);
// IO 처리가 하나 끝났으므로 IOCount를 감소시킨다.
if (InterlockedDecrement64(&completeSession->IOBlock->IOCount) == 0)
{
instance->ReleaseSession(completeSession);
}
}
}
return 0;
}