#ifndef _HAN_UNITED_BILLING_PROCESS_ #define _HAN_UNITED_BILLING_PROCESS_ #include #include #include #include #include #include #include // forward decl. class CIOCPNet; class CBufferFactory; namespace HanUnitedBilling { struct GLTransStruct; } //! --------------------------------------------------------------- //! //! Àü¿ª SequenceID Ŭ·¡½ºÀÌ´Ù. °¢ ÆÐŶ¿¡ ½ÃÄö½º ID¸¦ ¸Å±ä´Ù. //! //! --------------------------------------------------------------- class CHanUnitedSequenceID { public: static CHanUnitedSequenceID& GetInstance(); unsigned long GetUniqueID() { return m_dwSeqID++; } private: CHanUnitedSequenceID() : m_dwSeqID(0) { } ~CHanUnitedSequenceID() { } unsigned long m_dwSeqID; }; //! --------------------------------------------------------------- //! //! ·Î±×¾Æ¿ô Á¤º¸ ¸®½ºÆ®ÀÌ´Ù. //! ÁÖ±âÀûÀ¸·Î Ã¼Å©ÇØ¼­, Ack°¡ ¿ÀÁö ¾ÊÀ¸¸é ÀçÀü¼ÛÇÑ´Ù. //! //! --------------------------------------------------------------- class CHanUnitedLogout { public: static CHanUnitedLogout& GetInstance(); bool AddLogout(const PktUUT& pktUUT); bool RemoveLogout(const char* szID, const char* szIP, DWORD dwSeqID); void Retransmission(); private: struct LogoutData { PktUUT m_pktUUT; SYSTEMTIME m_systemTime; DWORD m_dwSendStamp; DWORD m_dwSeqID; LogoutData(const PktUUT& pktUUT, DWORD dwSeqID); }; typedef std::map LogoutMap; LogoutMap m_LogoutMap; }; //! --------------------------------------------------------------- //! //! ÇѰÔÀÓ ÅëÇÕºô¸µ ÆÐŶÀ» ó¸®Çϴ Ŭ·¡½ºÀÌ´Ù. //! //! --------------------------------------------------------------- class CHanUnitedDispatch : public CPacketDispatch { public: enum { DEFAULT_SEND_TIMEOUT_SEC = 10 }; // ¹Ìµð¾îÀ¥ ÅëÇÕºô¸µ¼­¹ö·Î ¿¬°áÀ» ½ÃµµÇÔ. static bool ConnectToHanUnited(CIOCPNet& iocpNet); static CSingleDispatch& GetDispatchTable(); CHanUnitedDispatch(CSession& Session); virtual ~CHanUnitedDispatch(); virtual bool ParsePacket(char* const lpStream_In, unsigned long* dwStreamSize_InOut); virtual bool Dispatch(); virtual void Connected(); virtual void Disconnected(); CBufferFactory& GetBufferFactory(); //! ÇѰÔÀÓ ÅëÇÕºô¸µÀ¸·Î ·Î±×ÀÎÀ» Àü¼ÛÇÑ´Ù. bool SendLogin(const PktUUT& pktUUT, const RE_USPCheckBilling_Login& checkBillingLogin, unsigned char cServerGroup, unsigned long dwTimeoutSec = DEFAULT_SEND_TIMEOUT_SEC); //! ÇѰÔÀÓ ÅëÇÕºô¸µÀ¸·Î ·Î±×¾Æ¿ôÀ» Àü¼ÛÇÑ´Ù. ½Ã°£À» ³ÖÁö ¾ÊÀ¸¸é ÇöÀç½Ã°£À¸·Î Àü¼ÛÇÑ´Ù. bool SendLogout(const PktUUT& pktUUT, unsigned long dwSeqID, LPSYSTEMTIME lpSystemTime = 0, unsigned long dwTimeoutSec = DEFAULT_SEND_TIMEOUT_SEC); //! ÇѰÔÀÓ ÅëÇÕºô¸µÀ¸·Î ·Î±×ÀÎÀÌ °¡´ÉÇÑÁö ¿©ºÎ¸¦ Àü¼ÛÇÑ´Ù. bool SendCanLogin(const PktUUT& pktUUT, const RE_USPCheckBilling_Login& checkBillingLogin, unsigned char cServerGroup, unsigned long dwTimeoutSec = DEFAULT_SEND_TIMEOUT_SEC); bool ProcessLoginResult(HanUnitedBilling::GLTransStruct& glTransStruct); // ·Î±×ÀÎ °á°ú ó¸® bool ProcessCanLoginResult(HanUnitedBilling::GLTransStruct& glTransStruct); // ·Î±×ÀÎ ÇÒ ¼ö ÀÖ´ÂÁö ¿©ºÎ·Î °á°ú ó¸®. bool ProcessWarnNotice(HanUnitedBilling::GLTransStruct& glTransStruct); // °ú±Ý °æ°í ¸Þ½ÃÁö bool ProcessCutIP(HanUnitedBilling::GLTransStruct& glTransStruct); // ƯÁ¤ ip²÷±â bool ProcessPing(HanUnitedBilling::GLTransStruct& glTransStruct); // ÇÎ ÆÐŶ ó¸® bool ProcessLogoutResult(HanUnitedBilling::GLTransStruct& glTransStruct); // ·Î±×¾Æ¿ô Ackó¸®. void ProcessTimeout(); void ProcessDisconnected(); protected: typedef CCSLock BufferLock; //! ·Î±×ÀÎ µ¥ÀÌÅÍ ¸Ê. timeout½Ã »ç¿ëÇϵµ·Ï Çϱâ À§ÇÔÀÌ´Ù. //! ·Î±×ÀÎ, ·Î±×ÀÎ °¡´É¿©ºÎ üũ½Ã¿¡¸¸ »ç¿ë struct LoginRequestData { enum { MAX_NAME_LEN = 16 }; __time64_t m_SendTime; unsigned long m_SendStamp; unsigned long m_dwTimeoutSec; unsigned long m_dwSeqID; unsigned short m_usMsgType; unsigned char m_cServerGroup; unsigned char m_cPadding; PktUUT m_PktUUT; RE_USPCheckBilling_Login m_CheckBillingLogin; LoginRequestData(const PktUUT& pktUUT, const RE_USPCheckBilling_Login& checkBillingLogin, unsigned long dwTimeoutSec, unsigned long dwSeqID, unsigned short usMsgType, unsigned char cServerGroup); }; typedef std::map, boost::fast_pool_allocator > > LoginRequestMap; BufferLock m_BufferLock; CACHE_PAD(BufferLockPad, sizeof(BufferLock)); CBufferQueue m_PacketBuffer; LoginRequestMap m_LoginRequestMap; }; #endif