|
안녕하세요 서버 프로그램을 만들고 있는데요
WSAEnumNetworkEvents 로 이벤트를 받을때
FD_ACCEPT를 받을때는 WSAAccept 로 소켓 핸들을 받아서
클라이언트가 어떤 핸들인지 알수있는데 FD_CLOSE를 받는 부분은
클라이언트 핸들을 받을수 있는게 없는것 같은데 맞나요
클라이언트 핸들을 받아야지 클라이언트 정보 구조체를 지울수 있는데요
혹 클라이언트 핸들을 받을수 있는 API나 혹은 특별이 구별할수 있는 정보를
얻을수 없을까요?
답변 부탁드립니다
while (!m_bShutDown)
{
/* 이벤트 Wait */
UINT32 dwResult = WSAWaitForMultipleEvents(1,&m_hEvent,FALSE,100,FALSE);
IsTrue(m_bShutDown);
if (dwResult == WSA_WAIT_TIMEOUT) continue;
/*이벤트를 알아내고 내부 네트웍 이벤트를 클리어 하고 이벤트 객체를 리셋 */
WSANETWORKEVENTS events;
int nResult = WSAEnumNetworkEvents(m_sServerSocket,m_hEvent,&events);
if (nResult == SOCKET_ERROR)
{
ShowMsgBox("IOCPSWin_ListenThreadProc : WSAEnumNetworkEvents","SOCKET_ERROR");
break;
}
/* 이벤트 처리 */
if( events.lNetworkEvents & FD_ACCEPT )
{
IsTrue(m_bShutDown);
SOCKET clientSocket = INVALID_SOCKET;
INT32 nResult = -1;
INT32 nClntSockLen = -1;
SOCKADDR_IN clientAddr = {0,};
nClntSockLen = sizeof(SOCKADDR_IN); // 소켓주소 사이즈 지정
clientSocket = WSAAccept(m_sServerSocket,(LPSOCKADDR)&clientAddr,&nClntSockLen,0,0); // 클라이언트 접속 허용
if(clientSocket == SOCKET_ERROR) // 에러발생
{
nResult = WSAGetLastError(); // 에러체크
if(nResult == WSAEWOULDBLOCK) // NON BLOCKING 모델에 Accept가 된 클라이언트가 없을때
{
ShowMsgBox("IOCPSWin_ListenThreadProc : WSAEWOULDBLOCK","SOCKET_ERROR");
}
}
else
{
if(AddClientInfo(clientSocket, clientAddr) !=ERROR_NONE)
{
ShowMsgBox("IOCPSWin_ListenThreadProc : CIOCPSWin_AddClientInfo","ERROR_DEFAULT");
}
}
}
else
{
/* 질문 부분 */
ClientInfo *pClientInfo = NULL;
if(FindClientInfo(?????) == ERROR_NONE)
{
IsMemory(pClientInfo);
CIOCPBuffer* pOverlapBuff = NULL;
pOverlapBuff = pClientInfo->m_pIOCPBuffer;
ReleaseClientInfo(&pClientInfo);
if(pOverlapBuff)
{
delete pOverlapBuff;
pOverlapBuff = NULL;
}
}
}
}
}
|