711 lines
25 KiB
Text
711 lines
25 KiB
Text
|
|
|
|||
|
|
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
// 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;
|
|||
|
|
}
|
|||
|
|
|