151 lines
4.9 KiB
C
151 lines
4.9 KiB
C
|
|
/*//===============================================================
|
|||
|
|
|
|||
|
|
<< 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"
|
|||
|
|
|