/////////////////////////////////////////////////////////////////////////////////////////////// // // ClientSocket Class // // Last Update : 2003-01-10 // /////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _GAMA_CLIENT_SOCKET_H_ #define _GAMA_CLIENT_SOCKET_H_ #include #include #include #include #include #include namespace ClientNet { // forward decl. class CNetworkMsgBlock; class CClientEventHandler; class CClientEventHandlerMgr; }; class ClientSocket { protected: ClientSocket(); virtual ~ClientSocket(); static ClientSocket* s_pInstance; public: static ClientSocket* CreateInstance(); static void DestroyInstance() { if(s_pInstance) { delete s_pInstance; s_pInstance = 0; } }; static ClientSocket* Instance() { return s_pInstance; }; enum Const { MAX_CHAT_SERVER_ADDR = 16, MAX_GAME_GUARD_CRYPT_HEADER_SIZE = 32 }; enum ConnectPort { DEFAULT_AUTH_TCP_PORT = 10110, DEFAULT_CLIENT_UDP_PORT = 20002 }; enum HandlerType { AuthEventHandler = 0, GameEventHandler = 1, MAX_HANDLER = 2 }; enum AddressType { PublicAddr = 0, PrivateAddr = 1, MoveZoneAddr = 2, MAX_ADDRESS = 3 }; // ------------------------------------------------------------------------------------------------ // ³×Æ®¿öÅ© »óÅ Ç÷¡±× // by Hades Kang void SetStatusFlag(unsigned long dwStatusFlag); unsigned long GetStatusFlag(); static bool IsNSFlagChecked(unsigned char ucCmdFlag); //ÇØ´ç Ç÷¡±×°¡ üũµÇ¾ú´ÂÁö ¿©ºÎ static bool IsNSFlagChainChecked(unsigned char ucCmdFlag); //ÇØ´ç Ç÷¡±× üÀÎÀÌ Ã¼Å©µÇ¾ú´ÂÁö ¿©ºÎ static void SetNSFlagOn(unsigned char ucCmdFlag); //ÇØ´ç Ç÷¡±×¸¦ Ȱ¼ºÈ­ ½ÃÅ´ - Send ½Ã¿¡ ¾²ÀÓ static void SetNSFlagOff(unsigned char ucCmdFlag); //ÇØ´ç Ç÷¡±×¿Í ¿¬°ü µÈ °ÍµéÀ» ºñȰ¼ºÈ­ ½ÃÅ´ - Receive ½Ã¿¡ ¾²ÀÓ static int CheckFlag( int* arrFlag ); //µð¹ö±ë¿ë // ------------------------------------------------------------------------------------------------ // Management Address SOCKADDR_IN& GetAddress(AddressType eAddrType) { return m_Address[eAddrType]; } const char* GetAddressString(AddressType eAddrType) { return inet_ntoa(m_Address[eAddrType].sin_addr); } unsigned short GetAddressPort(AddressType eAddrType) { return ntohs(m_Address[eAddrType].sin_port); } void SetAddress(AddressType eAddrType, SOCKADDR_IN& Address) { m_Address[eAddrType] = Address; } void SetAddress(AddressType eAddrType, const char* szAddress, unsigned port); void ClearAddress(AddressType eAddrType) { memset(m_Address + eAddrType, 0, sizeof(SOCKADDR_IN)); } ClientNet::CClientEventHandler& GetHandler(HandlerType eHandlerType) { return (0 == m_lpEventHandler[eHandlerType]) ? *m_lpNullEventHandler : *m_lpEventHandler[eHandlerType]; } void SetHandler(ClientNet::CClientEventHandler* lpHandler, HandlerType eHandlerType); void ResetHandler(ClientNet::CClientEventHandler* lpHandler, HandlerType eHandlerType); // ¼¼¼ÇÀ» »ý¼ºÇϰí, ¼­¹ö·Î ¿¬°áÇϰųª ÁöÁ¤ÇÑ ÁÖ¼Ò¿¡ ¹ÙÀεùÀ» ÇÑ´Ù. bool Open(const char* address, unsigned short usport, ClientNet::CClientEventHandler* lpEventHandler); // ¿¬°áµÇ¾îÀÖ´ÂÁö ¿©ºÎ¸¦ »ìÇÉ´Ù. bool IsConnected(HandlerType eHandlerType); // MAX_SESSIONÀÌ µé¾î¿À¸é ÀüºÎ Á¢¼ÓÀ» ²÷´Â´Ù. void Disconnect(HandlerType eHandlerType); // ¿¬°á ¹× ÆÐŶÀ» ó¸®ÇÑ´Ù. void HandleEvents(DWORD dwProcessPerCall); private: void InitNSCheckList(); // Network Status °ü·Ã Check List ÃʱâÈ­ ( Send, Receive ) void InitSendCheckList(); void InitReceiveCheckList(); SOCKADDR_IN m_Address[MAX_ADDRESS + 1]; ClientNet::CClientEventHandler* m_lpEventHandler[MAX_HANDLER + 1]; ClientNet::CClientEventHandler* m_lpNullEventHandler; ClientNet::CClientEventHandlerMgr* m_lpEventHandlerMgr; unsigned long m_dwStatusFlag; std::vector m_SendCheckList[CmdFinalPacketNum]; //º¸³¾¶§ üũ ÇØ¾ßÇÏ´Â Ä¿¸Çµå ¸®½ºÆ® ( Çϳª¶óµµ true ÀÏ °æ¿ì º¸³»Áö ¾Ê´Â´Ù! ) std::vector m_ReceiveCheckList[CmdFinalPacketNum]; //¹ÞÀ»¶§ üũ ÇØ¾ßÇÏ´Â Ä¿¸Çµå ¸®½ºÆ® ( ¸ðµÎ false·Î ó¸®ÇÑ´Ù. ) std::bitset m_bStatusFlag; }; #endif