/*//=============================================================== << EVENTSELECT TCP CLIENT >> PRGM : B4nFter FILE : EVENTSELECTTCPCLIENT.H, EVENTSELECTTCPCLIENT.INL DESC : WSAEventSelect() I/O ¸ðµ¨À» ÀÌ¿ëÇÏ¿© ¸¸µç TCP Ŭ¶óÀÌ¾ðÆ® ¸ðµâ (ÃÖ´ë 64-2 °³ÀÇ ¼¼¼Ç±îÁö¸¸ Á¢¼Ó °¡´ÉÇÔ) INIT BUILT DATE : 2005. 11. 20 LAST BUILT DATE : 2005. 11. 20 P.S.> - ÅÛÇø´ ÀÎÀÚ·Î ÀÚ½ÅÀÌ °ü¸®ÇÒ ¼¼¼Ç Ŭ·¡½º¸¦ ¸í½Ã - ¼¼¼Ç Ŭ·¡½º´Â TSESSION °¡ µÉ ¼ö´Â ¾ø°í ¹Ýµå½Ã À̸¦ »ó¼Ó¹ÞÀº Ŭ·¡½ºÀ̾î¾ß ÇÔ Copyright¨Ï 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 #include #include /////////////////////////////////////////////////////////////////// // DEFINE /////////////////////////////////////////////////////////////////// #define DF_ETCL_BASE_EVENT_COUNT (2) // WaitForMultipleEvents() ¿¡¼­ ±âº»À¸·Î ´ë±âÇÏ´Â À̺¥Æ® ¼ö (Á¾·áÀ̺¥Æ®, ÇÚµéÃß°¡À̺¥Æ®) #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 Ŭ¶óÀÌ¾ðÆ® Å¬·¡½º // PRGM : B4nFter //*--------------------------------------------------------------- template 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* 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* lpEventSelectTcpClientSession); BOOL UnregisterSession(CEventSelectTcpClientSession* 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* lpEventSelectTcpClientSession); BOOL IoEventSend(CEventSelectTcpClientSession* lpEventSelectTcpClientSession); VOID SetEventArray(LPHANDLE lphEventArray, CEventSelectTcpClientSession** lpEventSelectTcpClientSessionArray, INT& iEventCount); VOID SetEventArrayNoLock(LPHANDLE lphEventArray, CEventSelectTcpClientSession** lpEventSelectTcpClientSessionArray, INT& iEventCount); VOID SaveErrorMessage(INT iErrorCode, LPCTSTR lpszErrorMessage = NULL); static UINT __stdcall MainWorkerThreadProc(LPVOID lpParam); // WaitForMultipleEvents() - CNNT / RECV / SEND / CLSE ÀÛ¾÷½º·¹µå ÇÁ·Î½ÃÀú private: std::vector*> m_vtEventSelectTcpClientSession; CCriticalSection m_crEventSelectTcpClient; CMemPoolEx m_SessionMemoryPool; LPFN_ERROR_NOTIFY_PROC m_lpfnErrorNotifyProc; LPVOID m_lpErrorNotifyProcParam; HANDLE m_hEventEndThread; // ÀÛ¾÷ ½º·¹µå¸¦ Á¾·áÇÑ´Ù´Â À̺¥Æ® HANDLE m_hEventAddHandle; // À̺¥Æ® ÇÚµé ¹è¿­¿¡ À̺¥Æ®¸¦ Ãß°¡ÇÑ´Ù´Â À̺¥Æ® CThread m_EventSelectMainWorkerThread; EVENTDATA m_EventData; }; #include "EVENTSELECTTCPCLIENT.INL" #include "EVENTSELECTTCPCLIENTSESSION.INL"