/////////////////////////////////////////////////////////////////// // INCLUDE /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // IMPLEMENTATION /////////////////////////////////////////////////////////////////// //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CEventSelectTcpClient::CEventSelectTcpClient //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template CEventSelectTcpClient::CEventSelectTcpClient() { Initialize(); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CEventSelectTcpClient::~CEventSelectTcpClient //*--------------------------------------------------------------- // DESC : ¼Ò¸êÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template CEventSelectTcpClient::~CEventSelectTcpClient() { Finalize(); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CEventSelectTcpClient::Initialize //*--------------------------------------------------------------- // DESC : °´Ã¼ °ü·Ã ÀÚ¿øµéÀ» ÃʱâÈ­ // PARM : N/A // RETV : TRUE - ¼º°ø / FALSE - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- template BOOL CEventSelectTcpClient::Initialize() { m_lpfnErrorNotifyProc = NULL; m_lpErrorNotifyProcParam = NULL; m_hEventEndThread = NULL; m_hEventAddHandle = NULL; if (NOERROR != m_crEventSelectTcpClient.Open()) { BASE_RETURN(FALSE); } return TRUE; } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CEventSelectTcpClient::Finalize //*--------------------------------------------------------------- // DESC : °´Ã¼ °ü·Ã ÀÚ¿øµéÀ» ÇØÁ¦ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template VOID CEventSelectTcpClient::Finalize() { End(); m_crEventSelectTcpClient.Close(); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CEventSelectTcpClient::Start //*--------------------------------------------------------------- // DESC : °´Ã¼ÀÇ ±âº» µ¥ÀÌÅ͸¦ ¼¼ÆÃÇÏ°í »ç¿ë°¡´ÉÇÑ »óÅ·Π¼¼ÆÃ // PARM : 1 . uStackSize - ½º·¹µå ½ºÅÃÅ©±â (±âº»°ª 0 ¡æ 1MB) // 2 . m_lpPrepProc - ½º·¹µå ½ÃÀÛ ½Ã ½ÇÇàµÇ´Â ·çƾ (±âº»°ª NULL) // 3 . m_lpPostProc - ½º·¹µå Á¾·á ½Ã ½ÇÇàµÇ´Â ·çƾ (±âº»°ª NULL) // 4 . m_lpPrepProcParam - ½º·¹µå ½ÃÀÛ ·çƾ¿¡ Àü´ÞµÇ´Â ÀÎÀÚ (±âº»°ª NULL) // 5 . m_lpPostProcParam - ½º·¹µå Á¾·á ·çƾ¿¡ Àü´ÞµÇ´Â ÀÎÀÚ (±âº»°ª NULL) // RETV : TRUE - ¼º°ø / FALSE - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- template BOOL CEventSelectTcpClient::Start( UINT uStackSize, CThread::LPFN_PREP_PROC lpfnPrepProc, CThread::LPFN_POST_PROC lpfnPostProc, LPVOID lpPrepProcParam, LPVOID lpPostProcParam ) { // ¸ðµâ Àüü µ¿±âÈ­ CLockAuto AutoLock(&m_crEventSelectTcpClient); if (m_hEventEndThread != NULL || m_hEventAddHandle != NULL || m_EventSelectMainWorkerThread.GetHandle()) { // ÀÌ¹Ì Start() µÇ¾úÀ½ ? ¡æ End() ÀÌÈÄ »ç¿ë°¡´É SaveErrorMessage(0, _T("m_EventSelectMainWorkerThread.GetHandle() - CEventSelectTcpClient::Start()")); BASE_RETURN(FALSE); } BOOL bRetVal = m_EventSelectMainWorkerThread.Start( MainWorkerThreadProc, this, CVarArg<64>(_T("EVTC-MAIN")), uStackSize, FALSE, FALSE, lpfnPrepProc, lpfnPostProc, lpPrepProcParam, lpPostProcParam ); if (!bRetVal) { BASE_RETURN(FALSE); } bRetVal = m_EventSelectMainWorkerThread.SetPriority(THREAD_PRIORITY_NORMAL+2); if (!bRetVal) { BASE_RETURN(FALSE); } m_hEventEndThread = ::CreateEvent(NULL, FALSE, FALSE, NULL); if (!m_hEventEndThread) { SaveErrorMessage(::GetLastError(), _T(" - CEventSelectTcpClient::Start()")); BASE_RETURN(FALSE); } m_hEventAddHandle = ::CreateEvent(NULL, FALSE, FALSE, NULL); if (!m_hEventAddHandle) { SaveErrorMessage(::GetLastError(), _T(" - CEventSelectTcpClient::Start()")); BASE_RETURN(FALSE); } return TRUE; } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CEventSelectTcpClient::End //*--------------------------------------------------------------- // DESC : °´Ã¼ÀÇ ±âº» µ¥ÀÌÅ͸¦ ÇØÁ¦Çϰí ÃʱâÈ­ // PARM : N/A // RETV : TRUE - ¼º°ø / FALSE - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- template VOID CEventSelectTcpClient::End() { // ¸ðµâ Àüü µ¿±âÈ­ CLockAuto AutoLock(&m_crEventSelectTcpClient); if (m_EventSelectMainWorkerThread.GetHandle()) { // ÀÛ¾÷ ½º·¹µå¸¦ Á¾·á½ÃÅ´ ::SetEvent(m_hEventEndThread); ::WaitForSingleObject(m_EventSelectMainWorkerThread.GetHandle(), INFINITE); m_EventSelectMainWorkerThread .End(); } if (m_hEventEndThread) { ::CloseHandle(m_hEventEndThread); m_hEventEndThread = NULL; } if (m_hEventAddHandle) { ::CloseHandle(m_hEventAddHandle); m_hEventAddHandle = NULL; } std::vector*>::iterator it = m_vtEventSelectTcpClientSession.begin(); for (; it != m_vtEventSelectTcpClientSession.end() ; ++it) { if ((*it)) { (*it)->Reset(); (*it)->DeleteBuffer(); m_SessionMemoryPool.ReleaseMemory(static_cast(*it)); } } m_vtEventSelectTcpClientSession.clear(); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CEventSelectTcpClient::GetSession //*--------------------------------------------------------------- // DESC : »ç¿ë °¡´ÉÇÑ ¼¼¼Ç°´Ã¼¸¦ ¾òÀ½ // PARM : 1 . lpfnBaseNotifyProc - ±âº» À̺¥Æ® (¿¬°á, Á¾·á, ¿¡·¯) ¸¦ Å뺸¹ÞÀ» ÇÔ¼ö Æ÷ÀÎÅÍ // 2 . lpfnRecvNotifyProc - ¼ö½Å À̺¥Æ®¸¦ Å뺸¹ÞÀ» ÇÔ¼ö Æ÷ÀÎÅÍ // 3 . lpBaseNotifyProcParam - ±âº» À̺¥Æ® »ç¿ëÀÚ ÆÄ¶ó¸ÞÅÍ // 4 . lpRecvNotifyProcParam - ¼ö½Å À̺¥Æ® »ç¿ëÀÚ ÆÄ¶ó¸ÞÅÍ // 5 . iRecvAppBufferSize - ¼¼¼ÇÀÇ ¼ö½Å¹öÆÛ Å©±â (ÀÀ¿ë) // 6 . iSendAppBufferSize - ¼¼¼ÇÀÇ ¼Û½Å¹öÆÛ Å©±â (ÀÀ¿ë) // 7 . iRecvSckBufferSize - ¼¼¼ÇÀÇ ¼ö½Å¹öÆÛ Å©±â (¼ÒÄÏ) // 8 . iSendSckBufferSize - ¼¼¼ÇÀÇ ¼Û½Å¹öÆÛ Å©±â (¼ÒÄÏ) // RETV : ¼¼¼Ç °´Ã¼ Æ÷ÀÎÅÍ // PRGM : B4nFter //*--------------------------------------------------------------- template TSESSION* CEventSelectTcpClient::GetSession( LPFN_BASE_NOTIFY_PROC lpfnBaseNotifyProc, LPFN_RECV_NOTIFY_PROC lpfnRecvNotifyProc, LPVOID lpBaseNotifyProcParam, LPVOID lpRecvNotifyProcParam, INT iRecvAppBufferSize, INT iSendAppBufferSize, INT iRecvSckBufferSize, INT iSendSckBufferSize ) { if (!lpfnBaseNotifyProc || !lpfnRecvNotifyProc) { // ¿¡·¯ SaveErrorMessage(0, _T("!lpfnBaseNotifyProc || !lpfnRecvNotifyProc - CEventSelectTcpClient::GetSession()")); return NULL; } if (iRecvAppBufferSize <= 0 || iSendAppBufferSize <= 0) { // ¿¡·¯ SaveErrorMessage(0, _T("iRecvAppBufferSize <= 0 || iSendAppBufferSize <= 0 - CEventSelectTcpClient::GetSession()")); return NULL; } // ¸ðµâ Àüü µ¿±âÈ­ CLockAuto AutoLock(&m_crEventSelectTcpClient); TSESSION* lpEventSelectTcpClientSession = m_SessionMemoryPool.GetMemory(); if (!lpEventSelectTcpClientSession) { // ¿¡·¯ SaveErrorMessage(0, _T("!lpEventSelectTcpClientSession - CEventSelectTcpClient::GetSession()")); BASE_RETURN(NULL); } CEventSelectTcpClientSession* lpEventSelectTcpClientSession2 = static_cast*>(lpEventSelectTcpClientSession); // ¾ÆÁ÷ »ç¿ëÀÚ¿¡°Ô Àü´ÞµÇÁö ¾ÊÀº »óÅÂÀ̹ǷΠ¼¼¼Ç µ¿±âÈ­ ÇÊ¿ä¾øÀ½ lpEventSelectTcpClientSession2->SetIsActivated(TRUE); lpEventSelectTcpClientSession2->Reset(); lpEventSelectTcpClientSession2->SetEventSelectTcpClientPtr(this); lpEventSelectTcpClientSession2->SetBaseNotifyProc(lpfnBaseNotifyProc, lpBaseNotifyProcParam); lpEventSelectTcpClientSession2->SetRecvNotifyProc(lpfnRecvNotifyProc, lpRecvNotifyProcParam); lpEventSelectTcpClientSession2->SetSckBufferSize(iRecvSckBufferSize, iSendSckBufferSize); if (lpEventSelectTcpClientSession2->CreateBuffer(iRecvAppBufferSize, iSendAppBufferSize) == FALSE) { // ¿¡·¯ SaveErrorMessage(0, _T("lpEventSelectTcpClientSession2->CreateBuffer() == FALSE - CEventSelectTcpClient::GetSession()")); BASE_RETURN(NULL); } return lpEventSelectTcpClientSession; } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CEventSelectTcpClient::ReleaseSession //*--------------------------------------------------------------- // DESC : »ç¿ëÀÌ ³¡³­ ¼¼¼Ç°´Ã¼¸¦ ¹Ýȯ // PARM : 1 . lpEventSelectTcpClientSession - ¼¼¼Ç °´Ã¼ Æ÷ÀÎÅÍ // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template VOID CEventSelectTcpClient::ReleaseSession(TSESSION* lpEventSelectTcpClientSession) { if (!lpEventSelectTcpClientSession) { SaveErrorMessage(0, _T("!lpEventSelectTcpClientSession - CEventSelectTcpClient::ReleaseSession()")); return; } CEventSelectTcpClientSession* lpEventSelectTcpClientSession2 = static_cast*>(lpEventSelectTcpClientSession); // ¸ðµâ Àüü µ¿±âÈ­ CLockAuto AutoLock(&m_crEventSelectTcpClient); // ¼¼¼Ç º¸È£ ¡æ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÂÊ¿¡¼­ ÀÌ·ç¾îÁü (ÇÊ¿äÇÒ °æ¿ì¿¡¸¸) - ´ëºÎºÐ TSESSION::Disconnect() ÀÌÈÄ¿¡ ¹ÝȯÇϹǷΠū ÇÊ¿ä´Â ¾øÀ»µí if (lpEventSelectTcpClientSession2->GetIsActivated() == FALSE) { // ¿¡·¯ SaveErrorMessage(0, _T("lpEventSelectTcpClientSession2->GetIsActivated() == FALSE - CEventSelectTcpClient::ReleaseSession()")); return; } lpEventSelectTcpClientSession2->SetIsActivated(FALSE); lpEventSelectTcpClientSession2->Reset(); lpEventSelectTcpClientSession2->DeleteBuffer(); m_SessionMemoryPool.ReleaseMemory(lpEventSelectTcpClientSession); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CEventSelectTcpClient::RegisterSession //*--------------------------------------------------------------- // DESC : ¿¬°á ÈÄ ¼ÒÄÏÀ̺¥Æ®¸¦ ¹ÞÀ» ¼ö ÀÖµµ·Ï ¼¼¼Ç°´Ã¼¸¦ °ü¸®ÀÚ °´Ã¼¿¡ µî·Ï (ÀÚµ¿À¸·Î ¼öÇàµÊ) // PARM : 1 . lpEventSelectTcpClientSession - ¼¼¼Ç °´Ã¼ Æ÷ÀÎÅÍ // RETV : TRUE - ¼º°ø / FALSE - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- template BOOL CEventSelectTcpClient::RegisterSession(CEventSelectTcpClientSession* lpEventSelectTcpClientSession) { // ¼¼¼Ç º¸È£ ¡æ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÂÊ¿¡¼­ ÀÌ·ç¾îÁü if (!lpEventSelectTcpClientSession) { SaveErrorMessage(0, _T("!lpEventSelectTcpClientSession - CEventSelectTcpClient::RegisterSession()")); return FALSE; } if (lpEventSelectTcpClientSession->GetEventHandle() == NULL) { SaveErrorMessage(0, _T("lpEventSelectTcpClientSession->GetEventHandle() == NULL - CEventSelectTcpClient::RegisterSession()")); return FALSE; } // ¸ðµâ Àüü µ¿±âÈ­ CLockAuto AutoLock(&m_crEventSelectTcpClient); // ¼¼¼ÇÀÇ ÇÚµé°ú Æ÷ÀÎÅ͸¦ °ü¸®¿ë º¤ÅÍ¿¡ µî·ÏÇÑ´Ù. std::vector*>::iterator it = std::find(m_vtEventSelectTcpClientSession.begin(), m_vtEventSelectTcpClientSession.end(), lpEventSelectTcpClientSession); if (it == m_vtEventSelectTcpClientSession.end()) { m_vtEventSelectTcpClientSession.push_back(lpEventSelectTcpClientSession); } else { // ¿¡·¯ - ÇÚµéÀÌ Á¸ÀçÇÒ ¼ö ¾ø´Ù. Ȥ½Ã¶óµµ ÀÌ·± °æ¿ì°¡ ¹ß»ýÇÏ´ÂÁö Ã¼Å©ÇØ º¸¾Æ¾ß ÇÑ´Ù. SaveErrorMessage(0, _T("it != m_vtEventSelectTcpClientSession.end() - CEventSelectTcpClient::RegisterSession()")); } // ÀÛ¾÷ ½º·¹µå¿¡ ÇÚµéÀÌ Ãß°¡µÇ¾ú´Ù´Â À̺¥Æ®¸¦ º¸³½´Ù. if (m_hEventAddHandle) { ::SetEvent(m_hEventAddHandle); } return TRUE; } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CEventSelectTcpClient::UnregisterSession //*--------------------------------------------------------------- // DESC : Á¾·á ÈÄ ¼ÒÄÏÀ̺¥Æ®¸¦ ¹ÞÁö ¾Êµµ·Ï ¼¼¼Ç°´Ã¼¸¦ °ü¸®ÀÚ °´Ã¼¿¡¼­ µî·ÏÇØÁ¦ (ÀÚµ¿À¸·Î ¼öÇàµÊ) // PARM : 1 . lpEventSelectTcpClientSession - ¼¼¼Ç °´Ã¼ Æ÷ÀÎÅÍ // RETV : TRUE - ¼º°ø / FALSE - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- template BOOL CEventSelectTcpClient::UnregisterSession(CEventSelectTcpClientSession* lpEventSelectTcpClientSession) { // ¼¼¼Ç º¸È£ ¡æ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÂÊ¿¡¼­ ÀÌ·ç¾îÁü if (!lpEventSelectTcpClientSession) { SaveErrorMessage(0, _T("!lpEventSelectTcpClientSession - CEventSelectTcpClient::UnregisterSession()")); return FALSE; } if (lpEventSelectTcpClientSession->GetEventHandle() == NULL) { SaveErrorMessage(0, _T("lpEventSelectTcpClientSession->GetEventHandle() == NULL - CEventSelectTcpClient::UnregisterSession()")); return FALSE; } // ¸ðµâ Àüü µ¿±âÈ­ CLockAuto AutoLock(&m_crEventSelectTcpClient); // º¤ÅÍ¿¡¼­ ¼¼¼Ç¿¡ ¿¬°áµÈ À̺¥Æ® ÇÚµéÀ» ã¾Æ¼­ Á¦°ÅÇÑ´Ù. std::vector*>::iterator it = std::find(m_vtEventSelectTcpClientSession.begin(), m_vtEventSelectTcpClientSession.end(), lpEventSelectTcpClientSession); if (it != m_vtEventSelectTcpClientSession.end()) { m_vtEventSelectTcpClientSession.erase(it); } else { // ¿¡·¯ - ÇÚµéÀÌ Á¸ÀçÇØ¾ß ÇÑ´Ù. Ȥ½Ã¶óµµ ÀÌ·± °æ¿ì°¡ ¹ß»ýÇÏ´ÂÁö Ã¼Å©ÇØ º¸¾Æ¾ß ÇÑ´Ù. SaveErrorMessage(0, _T("it == m_vtEventSelectTcpClientSession.end() - CEventSelectTcpClient::UnregisterSession()")); } // ÀÛ¾÷ ½º·¹µå¿¡ ÇÚµéÀÌ Á¦°ÅµÇ¾ú´Ù´Â À̺¥Æ®¸¦ º¸³½´Ù. if (m_hEventAddHandle) { ::SetEvent(m_hEventAddHandle); } return TRUE; } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CEventSelectTcpClient::IoEventRecv //*--------------------------------------------------------------- // DESC : ƯÁ¤ ¼¼¼ÇÀ¸·Î Å뺸µÈ ¼ö½Å À̺¥Æ®¸¦ ó¸® // PARM : 1 . lpEventSelectTcpClientSession - ¼¼¼Ç °´Ã¼ Æ÷ÀÎÅÍ // RETV : TRUE - ¼º°ø / FALSE - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- template BOOL CEventSelectTcpClient::IoEventRecv(CEventSelectTcpClientSession* lpEventSelectTcpClientSession) { // RECV ¹öÆÛ¿¡ µ¥ÀÌÅ͸¦ ¹Þ¾Æ¼­ »ç¿ëÀÚ¿¡°Ô Å뺸ÇÑ´Ù. // ¼¼¼Ç µ¿±âÈ­ ¡æ RECV À̺¥Æ®°¡ ¹ß»ýÇÏ´Â ½º·¹µå°¡ ÇϳªÀ̹ǷΠ¼ÒÄÏ º¸È£¸¦ À§ÇØ WSARecv() ºÎºÐ¸¸ µ¿±âÈ­ // CLockAuto AutoLock(lpEventSelectTcpClientSession->GetCriticalSection()); if (lpEventSelectTcpClientSession->RecvData() == FALSE) { // ¿¡·¯ - SendLeftData() ³»ºÎ¿¡¼­ Á¾·áó¸® ÇÏ¿´À½ return FALSE; } return TRUE; } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CEventSelectTcpClient::IoEventSend //*--------------------------------------------------------------- // DESC : ƯÁ¤ ¼¼¼ÇÀ¸·Î Å뺸µÈ ¼Û½ÅÁ¾·á À̺¥Æ®¸¦ ó¸® // PARM : 1 . lpEventSelectTcpClientSession - ¼¼¼Ç °´Ã¼ Æ÷ÀÎÅÍ // RETV : TRUE - ¼º°ø / FALSE - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- template BOOL CEventSelectTcpClient::IoEventSend(CEventSelectTcpClientSession* lpEventSelectTcpClientSession) { // ¸¸¾à ÀÌÀü¿¡ º¸³»Áö ¸øÇÑ µ¥ÀÌ ÅͰ¡ ÀÖÀ¸¸é º¸³½´Ù. // ¼¼¼Ç µ¿±âÈ­ CLockAuto AutoLock(lpEventSelectTcpClientSession->GetLock()); if (lpEventSelectTcpClientSession->SendLeftData() == SOCKET_ERROR) { // ¿¡·¯ - SendLeftData() ³»ºÎ¿¡¼­ Á¾·áó¸® ÇÏ¿´À½ return FALSE; } return TRUE; } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CEventSelectTcpClient::SetEventArray //*--------------------------------------------------------------- // DESC : À̺¥Æ® ¹è¿­À» °»½Å // PARM : 1 . lphEventArray - À̺¥Æ® ÇÚµé // 2 . lpEventSelectTcpClientSessionArray - À̺¥Æ® ¹è¿­ Æ÷ÀÎÅÍ // 3 . iEventCount - µî·ÏµÈ À̺¥Æ® °³¼ö // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template VOID CEventSelectTcpClient::SetEventArray(LPHANDLE lphEventArray, CEventSelectTcpClientSession** lpEventSelectTcpClientSessionArray, INT& iEventCount) { // ¸ðµâ Àüü µ¿±âÈ­ CLockAuto AutoLock(&m_crEventSelectTcpClient); if (!lphEventArray || !lpEventSelectTcpClientSessionArray) { return; } lphEventArray[0] = m_hEventEndThread; lphEventArray[1] = m_hEventAddHandle; lpEventSelectTcpClientSessionArray[0] = NULL; lpEventSelectTcpClientSessionArray[1] = NULL; iEventCount = DF_ETCL_BASE_EVENT_COUNT; if (m_vtEventSelectTcpClientSession.empty()) { // ºó¹øÇÏ°Ô ¹ß»ý // BASE_TRACE(_T("m_vtEventSelectTcpClientSession.empty() - CEventSelectTcpClient::SetEventArray()")); return; } iEventCount += (INT)m_vtEventSelectTcpClientSession.size(); if (iEventCount >= WSA_MAXIMUM_WAIT_EVENTS) { // ÀÌ·± °æ¿ì°¡ ¹ß»ýÇÏ´ÂÁö Ã¼Å©ÇØ º¸¾Æ¾ß ÇÑ´Ù. iEventCount = WSA_MAXIMUM_WAIT_EVENTS; BASE_TRACE(_T("iEventCount >= WSA_MAXIMUM_WAIT_EVENTS - CEventSelectTcpClient::SetEventArray()")); } for (INT iIndex = DF_ETCL_BASE_EVENT_COUNT; iIndex < iEventCount ; ++iIndex) { lphEventArray[iIndex] = m_vtEventSelectTcpClientSession[iIndex-DF_ETCL_BASE_EVENT_COUNT]->GetEventHandle(); lpEventSelectTcpClientSessionArray[iIndex] = m_vtEventSelectTcpClientSession[iIndex-DF_ETCL_BASE_EVENT_COUNT]; if (lphEventArray[iIndex] == NULL) { // ¿¡·¯ - ÀÌ·± °æ¿ì°¡ »ý±â´ÂÁö È®ÀÎÇØ º¸¾Æ¾ß ÇÑ´Ù. BASE_TRACE(_T("lphEventArray[%d] == NULL - CEventSelectTcpClient::SetEventArray()"), iIndex); std::vector*>::iterator it = m_vtEventSelectTcpClientSession.begin() + iIndex - DF_ETCL_BASE_EVENT_COUNT; m_vtEventSelectTcpClientSession.erase(it); --iIndex; --iEventCount; } } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CEventSelectTcpClient::SaveErrorMessage //*--------------------------------------------------------------- // DESC : Ŭ·¡½º ³»ºÎ¿¡ ¿¡·¯¸Þ½ÃÁö¸¦ ÀúÀå, »ç¿ëÀÚ¿¡°Ô ¾Ë·ÁÁÜ // PARM : 1 . iErrorCode - ½Ã½ºÅÛ ¿¡·¯ÄÚµå // 2 . lpszErrorMessage - Ãß°¡ÀûÀÎ ¿¡·¯¸Þ½ÃÁö // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template VOID CEventSelectTcpClient::SaveErrorMessage(INT iErrorCode, LPCTSTR lpszErrorMessage) { if (m_lpfnErrorNotifyProc) { m_lpfnErrorNotifyProc(this, iErrorCode, m_ErrorFormat.Write(iErrorCode, lpszErrorMessage), m_lpErrorNotifyProcParam); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CEventSelectTcpClient::MainWorkerThreadProc //*--------------------------------------------------------------- // DESC : À̺¥Æ® 󸮸¦ ÁøÇàÇÒ ¸ÞÀÎ ÀÛ¾÷ ½º·¹µå ÇÁ·Î½ÃÀú // PARM : 1 . lpParam - °ü¸®ÀÚ °´Ã¼ÀÇ Æ÷ÀÎÅÍ // RETV : ½º·¹µå Á¾·áÄÚµå (0:OK) // PRGM : B4nFter //*--------------------------------------------------------------- template UINT __stdcall CEventSelectTcpClient::MainWorkerThreadProc(LPVOID lpParam) { CEventSelectTcpClient* lpEventSelectTcpClient = (CEventSelectTcpClient*) lpParam; if (lpEventSelectTcpClient == NULL) { return 0; } HANDLE hEventArray[WSA_MAXIMUM_WAIT_EVENTS]; CEventSelectTcpClientSession* lpEventSelectTcpClientSessionArray[WSA_MAXIMUM_WAIT_EVENTS]; WSANETWORKEVENTS stWsaNetworkEvents; INT iEventCount; INT iEventIndex; INT iRetVal; INT iErrNo; BOOL bEndThread = FALSE; // À̺¥Æ®¹è¿­À» ¼¼ÆÃÇÑ´Ù. lpEventSelectTcpClient->SetEventArray(hEventArray, lpEventSelectTcpClientSessionArray, iEventCount); while(!bEndThread) { iRetVal = ::WSAWaitForMultipleEvents( iEventCount, hEventArray, FALSE, WSA_INFINITE, FALSE ); if (iRetVal == WSA_WAIT_FAILED) { iRetVal = ::WSAGetLastError(); switch(iRetVal) { case ERROR_INVALID_HANDLE : // À߸øµÈ ÇÚµéÀÌ ¼¯¿©ÀÖ¾ú´Ù¸é ¿©±â¼­ ÇÚµéÅ×À̺íÀ» ´Ù½Ã ¼¼ÆÃÇÑ´Ù. lpEventSelectTcpClient->SetEventArray(hEventArray, lpEventSelectTcpClientSessionArray, iEventCount); continue; default : continue; } } iEventIndex = iRetVal - WSA_WAIT_EVENT_0; if (iEventIndex >= WSA_MAXIMUM_WAIT_EVENTS) { // ¿¡·¯ continue; } switch(iEventIndex) { case DF_ETCL_EVENT_END_THREAD: // ÀÛ¾÷½º·¹µå Á¾·á bEndThread = TRUE; continue; case DF_ETCL_EVENT_ADD_HANDLE: // À̺¥Æ®ÇÚµé ¹è¿­ Ãß°¡/»èÁ¦ ·Î ÀÎÇÑ º¯°æ lpEventSelectTcpClient->SetEventArray(hEventArray, lpEventSelectTcpClientSessionArray, iEventCount); continue; } // ÀϹÝÀûÀÎ ¼ÒÄÏ À̺¥Æ® ÀÓ if (lpEventSelectTcpClientSessionArray[iEventIndex]->GetSocket() == INVALID_SOCKET) { continue; } iErrNo = ::WSAEnumNetworkEvents( lpEventSelectTcpClientSessionArray[iEventIndex]->GetSocket(), hEventArray[iEventIndex], &stWsaNetworkEvents ); if (iErrNo == SOCKET_ERROR) { // ¿¡·¯ lpEventSelectTcpClient->SaveErrorMessage(::WSAGetLastError(), _T("WSAEnumNetworkEvents() - CEventSelectTcpClient::MainWorkerThreadProc()")); continue; } if (stWsaNetworkEvents.lNetworkEvents & FD_CONNECT) { if (stWsaNetworkEvents.iErrorCode[FD_CONNECT_BIT] != 0) { // ¿¡·¯ if (lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()) { lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()( EV_NBN_ERROR, lpEventSelectTcpClientSessionArray[iEventIndex], (LPVOID)lpEventSelectTcpClient->m_ErrorFormat.Write(stWsaNetworkEvents.iErrorCode[FD_CONNECT_BIT], _T("stWsaNetworkEvents.iErrorCode[FD_CONNECT_BIT] != 0 - CEventSelectTcpClient::MainWorkerThreadProc()")), lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProcParam() ); } // ¼¼¼ÇÀ» Á¾·á½Ã۰í Á¦°ÅÇÔ lpEventSelectTcpClientSessionArray[iEventIndex]->Disconnect(); continue; } // FD_CONNECT ÀÛ¾÷ // »õ·Î¿î À̺¥Æ®¸¦ µî·ÏÇÑ´Ù. iErrNo = ::WSAEventSelect(lpEventSelectTcpClientSessionArray[iEventIndex]->GetSocket(), hEventArray[iEventIndex], FD_READ | FD_WRITE | FD_CLOSE ); if (iErrNo == SOCKET_ERROR) { lpEventSelectTcpClient->SaveErrorMessage(::WSAGetLastError(), _T("WSAEventSelect() - CEventSelectTcpClient::MainWorkerThreadProc()")); // ¼¼¼ÇÀ» Á¾·á½Ã۰í Á¦°ÅÇÔ lpEventSelectTcpClientSessionArray[iEventIndex]->Disconnect(); continue; } // »ç¿ëÀÚ¿¡°Ô ¼¼¼ÇÀÌ ¿¬°áµÇ¾ú´Ù´Â °ÍÀ» ¾Ë¸°´Ù. if (lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()) { lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()(EV_NBN_SESSCNNT, lpEventSelectTcpClientSessionArray[iEventIndex], (LPVOID)NULL, lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProcParam()); } // ´Üµ¶ ÀÛ¾÷À̹ǷΠ´ÙÀ½À¸·Î ³Ñ¾î°¨ continue; } if (stWsaNetworkEvents.lNetworkEvents & FD_READ) { if (stWsaNetworkEvents.iErrorCode[FD_READ_BIT] != 0) { // ¿¡·¯ if (lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()) { lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()( EV_NBN_ERROR, lpEventSelectTcpClientSessionArray[iEventIndex], (LPVOID)lpEventSelectTcpClient->m_ErrorFormat.Write(stWsaNetworkEvents.iErrorCode[FD_READ_BIT], _T("stWsaNetworkEvents.iErrorCode[FD_READ_BIT] != 0 - CEventSelectTcpClient::MainWorkerThreadProc()")), lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProcParam() ); } // ¼¼¼ÇÀ» Á¾·á½Ã۰í Á¦°ÅÇÔ lpEventSelectTcpClientSessionArray[iEventIndex]->Disconnect(); continue; } // FD_READ ÀÛ¾÷ if (lpEventSelectTcpClient->IoEventRecv(lpEventSelectTcpClientSessionArray[iEventIndex]) == FALSE) { continue; } } if (stWsaNetworkEvents.lNetworkEvents & FD_WRITE) { if (stWsaNetworkEvents.iErrorCode[FD_WRITE_BIT] != 0) { // ¿¡·¯ if (lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()) { lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()( EV_NBN_ERROR, lpEventSelectTcpClientSessionArray[iEventIndex], (LPVOID)lpEventSelectTcpClient->m_ErrorFormat.Write(stWsaNetworkEvents.iErrorCode[FD_WRITE_BIT], _T("stWsaNetworkEvents.iErrorCode[FD_WRITE_BIT] != 0 - CEventSelectTcpClient::MainWorkerThreadProc()")), lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProcParam() ); } // ¼¼¼ÇÀ» Á¾·á½Ã۰í Á¦°ÅÇÔ lpEventSelectTcpClientSessionArray[iEventIndex]->Disconnect(); continue; } // FD_WRITE ÀÛ¾÷ if (lpEventSelectTcpClient->IoEventSend(lpEventSelectTcpClientSessionArray[iEventIndex]) == FALSE) { continue; } } if (stWsaNetworkEvents.lNetworkEvents & FD_CLOSE) { if (stWsaNetworkEvents.iErrorCode[FD_CLOSE_BIT] != 0) { // ¿¡·¯ /* if (lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()) { lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()( EV_NBN_ERROR, lpEventSelectTcpClientSessionArray[iEventIndex], (LPVOID)lpEventSelectTcpClient->m_ErrorFormat.Write(stWsaNetworkEvents.iErrorCode[FD_CLOSE_BIT], _T("stWsaNetworkEvents.iErrorCode[FD_CLOSE_BIT] != 0 - CEventSelectTcpClient::MainWorkerThreadProc()")), lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProcParam() ); } continue; */ } // »ç¿ëÀÚ¿¡°Ô ¼¼¼ÇÀÌ Á¾·áµÇ¾ú´Ù´Â °ÍÀ» ¾Ë¸°´Ù. if (lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()) { lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()( EV_NBN_SESSDCNT, lpEventSelectTcpClientSessionArray[iEventIndex], (LPVOID)NULL, lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProcParam() ); } // ¼¼¼ÇÀ» Á¾·á½Ã۰í Á¦°ÅÇÔ lpEventSelectTcpClientSessionArray[iEventIndex]->Disconnect(); } } return 0; }