DragonNest/Server/ServiceMonitorEx/Source/EventSelectTcpClient.inl

711 lines
25 KiB
Text
Raw Normal View History

2024-12-19 09:48:26 +08:00
///////////////////////////////////////////////////////////////////
// INCLUDE
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
// IMPLEMENTATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CEventSelectTcpClient::CEventSelectTcpClient
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
CEventSelectTcpClient<TSESSION>::CEventSelectTcpClient()
{
Initialize();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CEventSelectTcpClient::~CEventSelectTcpClient
//*---------------------------------------------------------------
// DESC : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
CEventSelectTcpClient<TSESSION>::~CEventSelectTcpClient()
{
Finalize();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CEventSelectTcpClient::Initialize
//*---------------------------------------------------------------
// DESC : <20><>ü <20><><EFBFBD><EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
// PARM : N/A
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
BOOL CEventSelectTcpClient<TSESSION>::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 : <20><>ü <20><><EFBFBD><EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
VOID CEventSelectTcpClient<TSESSION>::Finalize()
{
End();
m_crEventSelectTcpClient.Close();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CEventSelectTcpClient::Start
//*---------------------------------------------------------------
// DESC : <20><>ü<EFBFBD><C3BC> <20><20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EBB0A1><EFBFBD><EFBFBD> <20><><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . uStackSize - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ũ<EFBFBD><C5A9> (<28><EFBFBD><E2BABB> 0 <20><> 1MB)
// 2 . m_lpPrepProc - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><>ƾ (<28><EFBFBD><E2BABB> NULL)
// 3 . m_lpPostProc - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><>ƾ (<28><EFBFBD><E2BABB> NULL)
// 4 . m_lpPrepProcParam - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ƾ<EFBFBD><C6BE> <20><><EFBFBD>޵Ǵ<DEB5> <20><><EFBFBD><EFBFBD> (<28><EFBFBD><E2BABB> NULL)
// 5 . m_lpPostProcParam - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ƾ<EFBFBD><C6BE> <20><><EFBFBD>޵Ǵ<DEB5> <20><><EFBFBD><EFBFBD> (<28><EFBFBD><E2BABB> NULL)
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
BOOL CEventSelectTcpClient<TSESSION>::Start(
UINT uStackSize,
CThread::LPFN_PREP_PROC lpfnPrepProc,
CThread::LPFN_POST_PROC lpfnPostProc,
LPVOID lpPrepProcParam,
LPVOID lpPostProcParam
)
{
// <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>ȭ
CLockAuto AutoLock(&m_crEventSelectTcpClient);
if (m_hEventEndThread != NULL ||
m_hEventAddHandle != NULL ||
m_EventSelectMainWorkerThread.GetHandle()) {
// <20>̹<EFBFBD> Start() <20>Ǿ<EFBFBD><C7BE><EFBFBD> ? <20><> End() <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EBB0A1>
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 : <20><>ü<EFBFBD><C3BC> <20><20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ʱ<EFBFBD>ȭ
// PARM : N/A
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
VOID CEventSelectTcpClient<TSESSION>::End()
{
// <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>ȭ
CLockAuto AutoLock(&m_crEventSelectTcpClient);
if (m_EventSelectMainWorkerThread.GetHandle()) {
// <20>۾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŵ
::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<CEventSelectTcpClientSession<TSESSION>*>::iterator it = m_vtEventSelectTcpClientSession.begin();
for (; it != m_vtEventSelectTcpClientSession.end() ; ++it) {
if ((*it)) {
(*it)->Reset();
(*it)->DeleteBuffer();
m_SessionMemoryPool.ReleaseMemory(static_cast<TSESSION*>(*it));
}
}
m_vtEventSelectTcpClientSession.clear();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CEventSelectTcpClient::GetSession
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ǰ<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD>
// PARM : 1 . lpfnBaseNotifyProc - <20><20>̺<EFBFBD>Ʈ (<28><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>) <20><> <20><EFBFBD><EBBAB8><EFBFBD><EFBFBD> <20>Լ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 2 . lpfnRecvNotifyProc - <20><><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><EFBFBD><EBBAB8><EFBFBD><EFBFBD> <20>Լ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 3 . lpBaseNotifyProcParam - <20><20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
// 4 . lpRecvNotifyProcParam - <20><><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
// 5 . iRecvAppBufferSize - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD> ũ<><C5A9> (<28><><EFBFBD><EFBFBD>)
// 6 . iSendAppBufferSize - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>۽Ź<DBBD><C5B9><EFBFBD> ũ<><C5A9> (<28><><EFBFBD><EFBFBD>)
// 7 . iRecvSckBufferSize - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD> ũ<><C5A9> (<28><><EFBFBD><EFBFBD>)
// 8 . iSendSckBufferSize - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>۽Ź<DBBD><C5B9><EFBFBD> ũ<><C5A9> (<28><><EFBFBD><EFBFBD>)
// RETV : <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
TSESSION* CEventSelectTcpClient<TSESSION>::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) {
// <20><><EFBFBD><EFBFBD>
SaveErrorMessage(0, _T("!lpfnBaseNotifyProc || !lpfnRecvNotifyProc - CEventSelectTcpClient::GetSession()"));
return NULL;
}
if (iRecvAppBufferSize <= 0 || iSendAppBufferSize <= 0) {
// <20><><EFBFBD><EFBFBD>
SaveErrorMessage(0, _T("iRecvAppBufferSize <= 0 || iSendAppBufferSize <= 0 - CEventSelectTcpClient::GetSession()"));
return NULL;
}
// <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>ȭ
CLockAuto AutoLock(&m_crEventSelectTcpClient);
TSESSION* lpEventSelectTcpClientSession = m_SessionMemoryPool.GetMemory();
if (!lpEventSelectTcpClientSession) {
// <20><><EFBFBD><EFBFBD>
SaveErrorMessage(0, _T("!lpEventSelectTcpClientSession - CEventSelectTcpClient::GetSession()"));
BASE_RETURN(NULL);
}
CEventSelectTcpClientSession<TSESSION>* lpEventSelectTcpClientSession2 = static_cast<CEventSelectTcpClientSession<TSESSION>*>(lpEventSelectTcpClientSession);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD>޵<EFBFBD><DEB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD>
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) {
// <20><><EFBFBD><EFBFBD>
SaveErrorMessage(0, _T("lpEventSelectTcpClientSession2->CreateBuffer() == FALSE - CEventSelectTcpClient::GetSession()"));
BASE_RETURN(NULL);
}
return lpEventSelectTcpClientSession;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CEventSelectTcpClient::ReleaseSession
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ǰ<EFBFBD>ü<EFBFBD><C3BC> <20><>ȯ
// PARM : 1 . lpEventSelectTcpClientSession - <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
VOID CEventSelectTcpClient<TSESSION>::ReleaseSession(TSESSION* lpEventSelectTcpClientSession)
{
if (!lpEventSelectTcpClientSession) {
SaveErrorMessage(0, _T("!lpEventSelectTcpClientSession - CEventSelectTcpClient::ReleaseSession()"));
return;
}
CEventSelectTcpClientSession<TSESSION>* lpEventSelectTcpClientSession2 = static_cast<CEventSelectTcpClientSession<TSESSION>*>(lpEventSelectTcpClientSession);
// <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>ȭ
CLockAuto AutoLock(&m_crEventSelectTcpClient);
// <20><><EFBFBD><EFBFBD> <20><>ȣ <20><> <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> ȣ<><C8A3><EFBFBD>ϴ<EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD> (<28>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1>) - <20><><EFBFBD>κ<EFBFBD> TSESSION::Disconnect() <20><><EFBFBD>Ŀ<EFBFBD> <20><>ȯ<EFBFBD>ϹǷ<CFB9> ū <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (lpEventSelectTcpClientSession2->GetIsActivated() == FALSE) {
// <20><><EFBFBD><EFBFBD>
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 : <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><> <20>ֵ<EFBFBD><D6B5><EFBFBD> <20><><EFBFBD>ǰ<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> (<28>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
// PARM : 1 . lpEventSelectTcpClientSession - <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
BOOL CEventSelectTcpClient<TSESSION>::RegisterSession(CEventSelectTcpClientSession<TSESSION>* lpEventSelectTcpClientSession)
{
// <20><><EFBFBD><EFBFBD> <20><>ȣ <20><> <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> ȣ<><C8A3><EFBFBD>ϴ<EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD>
if (!lpEventSelectTcpClientSession) {
SaveErrorMessage(0, _T("!lpEventSelectTcpClientSession - CEventSelectTcpClient::RegisterSession()"));
return FALSE;
}
if (lpEventSelectTcpClientSession->GetEventHandle() == NULL) {
SaveErrorMessage(0, _T("lpEventSelectTcpClientSession->GetEventHandle() == NULL - CEventSelectTcpClient::RegisterSession()"));
return FALSE;
}
// <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>ȭ
CLockAuto AutoLock(&m_crEventSelectTcpClient);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
std::vector<CEventSelectTcpClientSession<TSESSION>*>::iterator it = std::find(m_vtEventSelectTcpClientSession.begin(), m_vtEventSelectTcpClientSession.end(), lpEventSelectTcpClientSession);
if (it == m_vtEventSelectTcpClientSession.end()) {
m_vtEventSelectTcpClientSession.push_back(lpEventSelectTcpClientSession);
}
else {
// <20><><EFBFBD><EFBFBD> - <20>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>. Ȥ<>ö<EFBFBD><C3B6><EFBFBD> <20>̷<EFBFBD> <20><><EFBFBD><20>߻<EFBFBD><DFBB>ϴ<EFBFBD><CFB4><EFBFBD> üũ<C3BC><C5A9> <20><><EFBFBD>ƾ<EFBFBD> <20>Ѵ<EFBFBD>.
SaveErrorMessage(0, _T("it != m_vtEventSelectTcpClientSession.end() - CEventSelectTcpClient::RegisterSession()"));
}
// <20>۾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20>ڵ<EFBFBD><DAB5><EFBFBD> <20>߰<EFBFBD><DFB0>Ǿ<EFBFBD><C7BE>ٴ<EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if (m_hEventAddHandle) {
::SetEvent(m_hEventAddHandle);
}
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CEventSelectTcpClient::UnregisterSession
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD>ǰ<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
// PARM : 1 . lpEventSelectTcpClientSession - <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
BOOL CEventSelectTcpClient<TSESSION>::UnregisterSession(CEventSelectTcpClientSession<TSESSION>* lpEventSelectTcpClientSession)
{
// <20><><EFBFBD><EFBFBD> <20><>ȣ <20><> <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> ȣ<><C8A3><EFBFBD>ϴ<EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD>
if (!lpEventSelectTcpClientSession) {
SaveErrorMessage(0, _T("!lpEventSelectTcpClientSession - CEventSelectTcpClient::UnregisterSession()"));
return FALSE;
}
if (lpEventSelectTcpClientSession->GetEventHandle() == NULL) {
SaveErrorMessage(0, _T("lpEventSelectTcpClientSession->GetEventHandle() == NULL - CEventSelectTcpClient::UnregisterSession()"));
return FALSE;
}
// <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>ȭ
CLockAuto AutoLock(&m_crEventSelectTcpClient);
// <20><><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD>ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ <20>ڵ<EFBFBD><DAB5><EFBFBD> ã<>Ƽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
std::vector<CEventSelectTcpClientSession<TSESSION>*>::iterator it = std::find(m_vtEventSelectTcpClientSession.begin(), m_vtEventSelectTcpClientSession.end(), lpEventSelectTcpClientSession);
if (it != m_vtEventSelectTcpClientSession.end()) {
m_vtEventSelectTcpClientSession.erase(it);
}
else {
// <20><><EFBFBD><EFBFBD> - <20>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>Ѵ<EFBFBD>. Ȥ<>ö<EFBFBD><C3B6><EFBFBD> <20>̷<EFBFBD> <20><><EFBFBD><20>߻<EFBFBD><DFBB>ϴ<EFBFBD><CFB4><EFBFBD> üũ<C3BC><C5A9> <20><><EFBFBD>ƾ<EFBFBD> <20>Ѵ<EFBFBD>.
SaveErrorMessage(0, _T("it == m_vtEventSelectTcpClientSession.end() - CEventSelectTcpClient::UnregisterSession()"));
}
// <20>۾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD>ŵǾ<C5B5><C7BE>ٴ<EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if (m_hEventAddHandle) {
::SetEvent(m_hEventAddHandle);
}
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CEventSelectTcpClient::IoEventRecv
//*---------------------------------------------------------------
// DESC : Ư<><C6AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBBAB8> <20><><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> ó<><C3B3>
// PARM : 1 . lpEventSelectTcpClientSession - <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
BOOL CEventSelectTcpClient<TSESSION>::IoEventRecv(CEventSelectTcpClientSession<TSESSION>* lpEventSelectTcpClientSession)
{
// RECV <20><><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>޾Ƽ<DEBE> <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><EFBFBD>Ѵ<EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ <20><> RECV <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20>߻<EFBFBD><DFBB>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20>ϳ<EFBFBD><CFB3>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20><><EFBFBD><EFBFBD> WSARecv() <20>κи<CEBA> <20><><EFBFBD><EFBFBD>ȭ
// CLockAuto AutoLock(lpEventSelectTcpClientSession->GetCriticalSection());
if (lpEventSelectTcpClientSession->RecvData() == FALSE) {
// <20><><EFBFBD><EFBFBD> - SendLeftData() <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> <20>Ͽ<EFBFBD><CFBF><EFBFBD>
return FALSE;
}
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CEventSelectTcpClient::IoEventSend
//*---------------------------------------------------------------
// DESC : Ư<><C6AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBBAB8> <20>۽<EFBFBD><DBBD><EFBFBD><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> ó<><C3B3>
// PARM : 1 . lpEventSelectTcpClientSession - <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
BOOL CEventSelectTcpClient<TSESSION>::IoEventSend(CEventSelectTcpClientSession<TSESSION>* lpEventSelectTcpClientSession)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ
CLockAuto AutoLock(lpEventSelectTcpClientSession->GetLock());
if (lpEventSelectTcpClientSession->SendLeftData() == SOCKET_ERROR) {
// <20><><EFBFBD><EFBFBD> - SendLeftData() <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> <20>Ͽ<EFBFBD><CFBF><EFBFBD>
return FALSE;
}
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CEventSelectTcpClient::SetEventArray
//*---------------------------------------------------------------
// DESC : <20>̺<EFBFBD>Ʈ <20><EFBFBD><E8BFAD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . lphEventArray - <20>̺<EFBFBD>Ʈ <20>ڵ<EFBFBD>
// 2 . lpEventSelectTcpClientSessionArray - <20>̺<EFBFBD>Ʈ <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 3 . iEventCount - <20><><EFBFBD>ϵ<EFBFBD> <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
VOID CEventSelectTcpClient<TSESSION>::SetEventArray(LPHANDLE lphEventArray, CEventSelectTcpClientSession<TSESSION>** lpEventSelectTcpClientSessionArray, INT& iEventCount)
{
// <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>ȭ
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()) {
// <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>߻<EFBFBD>
// BASE_TRACE(_T("m_vtEventSelectTcpClientSession.empty() - CEventSelectTcpClient::SetEventArray()"));
return;
}
iEventCount += (INT)m_vtEventSelectTcpClientSession.size();
if (iEventCount >= WSA_MAXIMUM_WAIT_EVENTS) {
// <20>̷<EFBFBD> <20><><EFBFBD><20>߻<EFBFBD><DFBB>ϴ<EFBFBD><CFB4><EFBFBD> üũ<C3BC><C5A9> <20><><EFBFBD>ƾ<EFBFBD> <20>Ѵ<EFBFBD>.
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) {
// <20><><EFBFBD><EFBFBD> - <20>̷<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD>ƾ<EFBFBD> <20>Ѵ<EFBFBD>.
BASE_TRACE(_T("lphEventArray[%d] == NULL - CEventSelectTcpClient::SetEventArray()"), iIndex);
std::vector<CEventSelectTcpClientSession<TSESSION>*>::iterator it = m_vtEventSelectTcpClientSession.begin() + iIndex - DF_ETCL_BASE_EVENT_COUNT;
m_vtEventSelectTcpClientSession.erase(it);
--iIndex;
--iEventCount;
}
}
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CEventSelectTcpClient::SaveErrorMessage
//*---------------------------------------------------------------
// DESC : Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20>˷<EFBFBD><CBB7><EFBFBD>
// PARM : 1 . iErrorCode - <20>ý<EFBFBD><C3BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
// 2 . lpszErrorMessage - <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>޽<EFBFBD><DEBD><EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
VOID CEventSelectTcpClient<TSESSION>::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 : <20>̺<EFBFBD>Ʈ ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ν<EFBFBD><CEBD><EFBFBD>
// PARM : 1 . lpParam - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// RETV : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD> (0:OK)
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
UINT __stdcall CEventSelectTcpClient<TSESSION>::MainWorkerThreadProc(LPVOID lpParam)
{
CEventSelectTcpClient* lpEventSelectTcpClient = (CEventSelectTcpClient*) lpParam;
if (lpEventSelectTcpClient == NULL) {
return 0;
}
HANDLE hEventArray[WSA_MAXIMUM_WAIT_EVENTS];
CEventSelectTcpClientSession<TSESSION>* lpEventSelectTcpClientSessionArray[WSA_MAXIMUM_WAIT_EVENTS];
WSANETWORKEVENTS stWsaNetworkEvents;
INT iEventCount;
INT iEventIndex;
INT iRetVal;
INT iErrNo;
BOOL bEndThread = FALSE;
// <20>̺<EFBFBD>Ʈ<EFBFBD><EFBFBD><E8BFAD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
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 : // <20>߸<EFBFBD><DFB8><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>ٸ<EFBFBD> <20><><EFBFBD><20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
lpEventSelectTcpClient->SetEventArray(hEventArray, lpEventSelectTcpClientSessionArray, iEventCount);
continue;
default :
continue;
}
}
iEventIndex = iRetVal - WSA_WAIT_EVENT_0;
if (iEventIndex >= WSA_MAXIMUM_WAIT_EVENTS) {
// <20><><EFBFBD><EFBFBD>
continue;
}
switch(iEventIndex) {
case DF_ETCL_EVENT_END_THREAD: // <20>۾<EFBFBD><DBBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
bEndThread = TRUE;
continue;
case DF_ETCL_EVENT_ADD_HANDLE: // <20>̺<EFBFBD>Ʈ<EFBFBD>ڵ<EFBFBD> <20><20>߰<EFBFBD>/<2F><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
lpEventSelectTcpClient->SetEventArray(hEventArray, lpEventSelectTcpClientSessionArray, iEventCount);
continue;
}
// <20>Ϲ<EFBFBD><CFB9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ <20><>
if (lpEventSelectTcpClientSessionArray[iEventIndex]->GetSocket() == INVALID_SOCKET) {
continue;
}
iErrNo = ::WSAEnumNetworkEvents(
lpEventSelectTcpClientSessionArray[iEventIndex]->GetSocket(),
hEventArray[iEventIndex],
&stWsaNetworkEvents
);
if (iErrNo == SOCKET_ERROR) {
// <20><><EFBFBD><EFBFBD>
lpEventSelectTcpClient->SaveErrorMessage(::WSAGetLastError(), _T("WSAEnumNetworkEvents() - CEventSelectTcpClient::MainWorkerThreadProc()"));
continue;
}
if (stWsaNetworkEvents.lNetworkEvents & FD_CONNECT) {
if (stWsaNetworkEvents.iErrorCode[FD_CONNECT_BIT] != 0) {
// <20><><EFBFBD><EFBFBD>
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()
);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lpEventSelectTcpClientSessionArray[iEventIndex]->Disconnect();
continue;
}
// FD_CONNECT <20>۾<EFBFBD>
// <20><><EFBFBD>ο<EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
iErrNo = ::WSAEventSelect(lpEventSelectTcpClientSessionArray[iEventIndex]->GetSocket(),
hEventArray[iEventIndex],
FD_READ | FD_WRITE | FD_CLOSE
);
if (iErrNo == SOCKET_ERROR) {
lpEventSelectTcpClient->SaveErrorMessage(::WSAGetLastError(), _T("WSAEventSelect() - CEventSelectTcpClient::MainWorkerThreadProc()"));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lpEventSelectTcpClientSessionArray[iEventIndex]->Disconnect();
continue;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ٴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>.
if (lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()) {
lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()(EV_NBN_SESSCNNT, lpEventSelectTcpClientSessionArray[iEventIndex], (LPVOID)NULL, lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProcParam());
}
// <20>ܵ<EFBFBD> <20>۾<EFBFBD><DBBE>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ
continue;
}
if (stWsaNetworkEvents.lNetworkEvents & FD_READ) {
if (stWsaNetworkEvents.iErrorCode[FD_READ_BIT] != 0) {
// <20><><EFBFBD><EFBFBD>
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()
);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lpEventSelectTcpClientSessionArray[iEventIndex]->Disconnect();
continue;
}
// FD_READ <20>۾<EFBFBD>
if (lpEventSelectTcpClient->IoEventRecv(lpEventSelectTcpClientSessionArray[iEventIndex]) == FALSE) {
continue;
}
}
if (stWsaNetworkEvents.lNetworkEvents & FD_WRITE) {
if (stWsaNetworkEvents.iErrorCode[FD_WRITE_BIT] != 0) {
// <20><><EFBFBD><EFBFBD>
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()
);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lpEventSelectTcpClientSessionArray[iEventIndex]->Disconnect();
continue;
}
// FD_WRITE <20>۾<EFBFBD>
if (lpEventSelectTcpClient->IoEventSend(lpEventSelectTcpClientSessionArray[iEventIndex]) == FALSE) {
continue;
}
}
if (stWsaNetworkEvents.lNetworkEvents & FD_CLOSE) {
if (stWsaNetworkEvents.iErrorCode[FD_CLOSE_BIT] != 0) {
// <20><><EFBFBD><EFBFBD>
/*
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;
*/
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ٴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>.
if (lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()) {
lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProc()(
EV_NBN_SESSDCNT,
lpEventSelectTcpClientSessionArray[iEventIndex],
(LPVOID)NULL,
lpEventSelectTcpClientSessionArray[iEventIndex]->GetBaseNotifyProcParam()
);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lpEventSelectTcpClientSessionArray[iEventIndex]->Disconnect();
}
}
return 0;
}