void
CSocketBase::sendRemainedPackets()
{
this->m_Mutex.Lock();
while (!this->m_SendQueue.empty())
{
SOCKET_SEND_DATA data = this->m_SendQueue.top();
//패킷을 보냈으면..
if (this->sendPacket(data))
{
//팝한다
this->m_SendQueue.pop();
delete[] data.p;
}
}
this->m_Mutex.Unlock();
}
bool
CSocketBase::sendPacket(SOCKET_SEND_DATA &Data)
{
size_t nRest;
int nRet;
char* pData = Data.p;
nRest = Data.size;
while (nRest)
{
nRet = send(this->m_hSocket, pData, (int)nRest, 0);
if (nRet == SOCKET_ERROR)
{
//보내기가 취소 됬으면..
if (WSAGetLastError() == WSAEWOULDBLOCK)
{
}
else
{
//접속이 끊긴것이다.
this->Disconnect();
this->OnDisconnect();
//return true;
}
return false;
}
nRest -= nRet;
pData += nRet;
}
return true;
}
void
CMajakSocketBase::MainLoop()
{
WSANETWORKEVENTS wne;
while (!this->m_bTermSig)
{
if (!this->m_bConnected)
{
Sleep(1);
continue;
}
this->sendRemainedPackets();
//이벤트를 얻자.
WSAWaitForMultipleEvents(1, &this->m_hEvent, false, 10, false);
WSAEnumNetworkEvents(this->m_hSocket, this->m_hEvent, &wne);
if (wne.lNetworkEvents & FD_CONNECT)
{
if (wne.iErrorCode[FD_CONNECT_BIT] != 0)
{
this->m_bConnected = false;
}
this->OnConnect(this->m_bConnected);
}
if (wne.lNetworkEvents & FD_READ)
{
this->recvPacket();
}
if (wne.lNetworkEvents & FD_WRITE)
{
this->sendRemainedPackets();
}
if (wne.lNetworkEvents & FD_CLOSE)
{
if (!this->m_bUserDisconnect)
{
this->Disconnect();
this->OnDisconnect();
}
else
{
this->m_bUserDisconnect = false;
}
}
}//whlie
}
댓글을 달아 주세요
IOCP이벤트를 강제로 날릴수있어요..
날려보세요..
핸들을 NULL로 날려서 핸들이 NULL일때 끝내면 될듯..
그 문제가 아닙니다.
worker 스레드를 종료하기 전에 accept 스레드를 종료할때 문제입니다. accept 스레드는 위 글에도 써놨지만 IOCP를 안쓰고 있거든요.
서버 종료 명령을 내리면 accept 스레드를 먼저 종료합니다. accept 스레드가 종료되면서 worker 스레드에게 이벤트를 날립니다. 그런데 accept스레드가 종료가 안되니 저런 현상이 발생한 것이지요..
어차피 종료하실거라면, 먼저 listen 소켓부터 종료해보심이..
listen 소켓을 닫는다는 것에 대해서 좀 더 자세히 설명해 주실수 있으시나요? 어차피 accept함수는 비동기로 되어 있어서 일정한 시간 후에 자동으로 리턴 되도록 되어있습니다.
listen 소켓을 종료한다는건, 처음에 server 로 지정한 소켓을 말하는건데 accept 에서 즉각 리턴을 안하니깐 스레드가 바로 종료안하는게 아닐까요? 그래서 accept 가 잡고있는 listen 하고 있는 소켓을 먼저 종료해도 될거같다고 글을 남긴건데요, 제가 non-blocking 모드로 소켓을 한건 예전에 공부할때 사용한적 빼곤 없어서 별로 도움이 안될 것 같네요.
무슨 말씀이신지 이해했습니다. 조언 감사합니다.