DragonNest/Server/ServiceMonitorEx/Source/EventSelectTcpClient.h

151 lines
4.9 KiB
C
Raw Normal View History

2024-12-19 09:48:26 +08:00
/*//===============================================================
<< EVENTSELECT TCP CLIENT >>
PRGM : B4nFter
FILE : EVENTSELECTTCPCLIENT.H, EVENTSELECTTCPCLIENT.INL
DESC : WSAEventSelect() I/O <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̿<EFBFBD><EFBFBD>Ͽ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> TCP Ŭ<EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD>Ʈ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<EFBFBD>ִ<EFBFBD> 64-2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>DZ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
INIT BUILT DATE : 2005. 11. 20
LAST BUILT DATE : 2005. 11. 20
P.S.>
- <EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD> <EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TSESSION <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD≯<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ӹ<EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
Copyright<EFBFBD><EFBFBD> 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved.
*///===============================================================
#pragma once
///////////////////////////////////////////////////////////////////
// INCLUDE
///////////////////////////////////////////////////////////////////
#include "EVENTSELECTTCPCLIENTSESSION.H"
#include "MEMPOOLEX.HPP"
#include "THREAD.H"
#include "VARARG.HPP"
#include <VECTOR>
#include <MAP>
#include <ALGORITHM>
///////////////////////////////////////////////////////////////////
// DEFINE
///////////////////////////////////////////////////////////////////
#define DF_ETCL_BASE_EVENT_COUNT (2) // WaitForMultipleEvents() <20><><EFBFBD><EFBFBD> <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>̺<EFBFBD>Ʈ <20><> (<28><><EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD>Ʈ, <20>ڵ<EFBFBD><DAB5>߰<EFBFBD><DFB0>̺<EFBFBD>Ʈ)
#define DF_ETCL_EVENT_END_THREAD (0-WSA_WAIT_EVENT_0)
#define DF_ETCL_EVENT_ADD_HANDLE (1-WSA_WAIT_EVENT_0)
#define DF_ETCL_DEFAULT_RECVBUFFER_SIZE (4096)
#define DF_ETCL_DEFAULT_SENDBUFFER_SIZE (4096)
///////////////////////////////////////////////////////////////////
// DECLARATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : CLASS
// NAME : CEventSelectTcpClient
//*---------------------------------------------------------------
// DESC : EventSelect TCP Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ Ŭ<><C5AC><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
class CEventSelectTcpClient : public CWinsockBase
{
public:
typedef struct EVENTDATA
{
public:
EVENTDATA() {
Reset();
}
VOID Reset() {
::memset(m_hEventArray, 0, sizeof(m_hEventArray));
::memset(m_lpEventSelectTcpClientSessionArray, 0, sizeof(m_lpEventSelectTcpClientSessionArray));
m_iEventCount = 0;
}
public:
HANDLE m_hEventArray[WSA_MAXIMUM_WAIT_EVENTS];
CEventSelectTcpClientSession<TSESSION>* m_lpEventSelectTcpClientSessionArray[WSA_MAXIMUM_WAIT_EVENTS];
INT m_iEventCount;
} *LPEVENTDATA;
public:
CEventSelectTcpClient();
virtual ~CEventSelectTcpClient();
BOOL Start(
UINT uStackSize = 0,
CThread::LPFN_PREP_PROC lpfnPrepProc = NULL,
CThread::LPFN_POST_PROC lpfnPostProc = NULL,
LPVOID lpPrepProcParam = NULL,
LPVOID lpPostProcParam = NULL
);
VOID End();
TSESSION* GetSession(
LPFN_BASE_NOTIFY_PROC lpfnBaseNotifyProc,
LPFN_RECV_NOTIFY_PROC lpfnRecvNotifyProc,
LPVOID lpBaseNotifyProcParam,
LPVOID lpRecvNotifyProcParam,
INT iRecvBufferSize = DF_ETCL_DEFAULT_RECVBUFFER_SIZE,
INT iSendBufferSize = DF_ETCL_DEFAULT_SENDBUFFER_SIZE,
INT iRecvSckBufferSize = -1,
INT iSendSckBufferSize = -1
);
VOID ReleaseSession(TSESSION* lpEventSelectTcpClientSession);
BOOL RegisterSession(CEventSelectTcpClientSession<TSESSION>* lpEventSelectTcpClientSession);
BOOL UnregisterSession(CEventSelectTcpClientSession<TSESSION>* lpEventSelectTcpClientSession);
VOID SetErrorNotifyProc(LPFN_ERROR_NOTIFY_PROC lpfnErrorNotifyProc, LPVOID lpErrorNotifyProcParam = NULL) {
m_lpfnErrorNotifyProc = lpfnErrorNotifyProc;
m_lpErrorNotifyProcParam = lpErrorNotifyProcParam;
}
LPFN_ERROR_NOTIFY_PROC GetErrorNotifyProc() { return m_lpfnErrorNotifyProc; }
LPVOID GetErrorNotifyProcParam() { return m_lpErrorNotifyProcParam; }
private:
BOOL Initialize();
VOID Finalize();
protected:
BOOL IoEventRecv(CEventSelectTcpClientSession<TSESSION>* lpEventSelectTcpClientSession);
BOOL IoEventSend(CEventSelectTcpClientSession<TSESSION>* lpEventSelectTcpClientSession);
VOID SetEventArray(LPHANDLE lphEventArray, CEventSelectTcpClientSession<TSESSION>** lpEventSelectTcpClientSessionArray, INT& iEventCount);
VOID SetEventArrayNoLock(LPHANDLE lphEventArray, CEventSelectTcpClientSession<TSESSION>** lpEventSelectTcpClientSessionArray, INT& iEventCount);
VOID SaveErrorMessage(INT iErrorCode, LPCTSTR lpszErrorMessage = NULL);
static UINT __stdcall MainWorkerThreadProc(LPVOID lpParam); // WaitForMultipleEvents() - CNNT / RECV / SEND / CLSE <20>۾<EFBFBD><DBBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ν<EFBFBD><CEBD><EFBFBD>
private:
std::vector<CEventSelectTcpClientSession<TSESSION>*> m_vtEventSelectTcpClientSession;
CCriticalSection m_crEventSelectTcpClient;
CMemPoolEx<TSESSION, 16, 16> m_SessionMemoryPool;
LPFN_ERROR_NOTIFY_PROC m_lpfnErrorNotifyProc;
LPVOID m_lpErrorNotifyProcParam;
HANDLE m_hEventEndThread; // <20>۾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ѵٴ<D1B4> <20>̺<EFBFBD>Ʈ
HANDLE m_hEventAddHandle; // <20>̺<EFBFBD>Ʈ <20>ڵ<EFBFBD> <20><EFBFBD><E8BFAD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD><DFB0>Ѵٴ<D1B4> <20>̺<EFBFBD>Ʈ
CThread m_EventSelectMainWorkerThread;
EVENTDATA m_EventData;
};
#include "EVENTSELECTTCPCLIENT.INL"
#include "EVENTSELECTTCPCLIENTSESSION.INL"