#pragma once #include #include "Function/ExitProcess.WorkLoad.h" #include "UserSessions/UserInfo.SecureXignCode.h" // USING_XIGNCODE // #define AGENT_SERVER_INFO_FILE_NAME ".\\AgentServer.ini" #define SHUTDOWN_NOACTION_DELAY_TIME (10*1000) // ------------------------------------- // class ServerSessionEx; class MasterServerSession; class AuthAgentServerSession; class DBProxyServerSession; class WorldServerSession; // ------------------------------------- class ScriptParserManager; // ------------------------------------- //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦´ // // __NA000630_070817_MOLA_5th_UPDATE #include struct sCLIENT_INIT_PRE_ENTRY_WRAP { IWzGResTableInServer m_GResTable; #if USING_HACKSHIELD AHNHS_SERVER_HANDLE m_hHANDLEofHS; #elif USING_XIGNCODE #elif USING_FROST #endif sCLIENT_INIT_PRE_ENTRY_WRAP() { sCLIENT_INIT_PRE_ENTRY Entry( &m_GResTable ); #if USING_HACKSHIELD m_hHANDLEofHS = ANTICPX_INVALID_HANDLE_VALUE; #elif USING_XIGNCODE #elif USING_FROST #endif }; inline VOID SetActiveTransactionUser( User* pUser ) { m_GResTable.SetActiveTransactionUser( pUser ); } inline User* GetActiveTransactionUser() { return m_GResTable.GetActiveTransactionUser(); } #if USING_HACKSHIELD inline AHNHS_SERVER_HANDLE GetHANDLEofHS() { return m_hHANDLEofHS; } inline VOID SetHANDLEofHS( AHNHS_SERVER_HANDLE hHS ) { m_hHANDLEofHS = hHS; } #elif USING_XIGNCODE #elif USING_FROST #endif }; ////////////////////////////////////////////////////////////////////////// //
class AgentServer : public ServerFrame { USING_DUMMY_CLIENT_FRIEND_ACCESS; public: //------------------------------------- // AgentServer(); ~AgentServer(); // static AgentServer* CreateInstance(); static AgentServer* GetInstance() { return instance_; } static void DestroyInstance(); // ========================================================================================================= // // ÄÜ¼Ö ¸Þ½ÃÁö Äݹé public: friend void CallBackCommand( char * szMessage ); public: // Callback Handlers static NetworkObject* CreateServerSideAcceptedObject(); static VOID DestroyServerSideAcceptedObject( NetworkObject* pNetworkObject ); static VOID DestroyServerSideConnectedObject( NetworkObject* pNetworkObject ); static NetworkObject* CreateClientSideAcceptedObject(); static VOID DestroyClientSideAcceptedObject( NetworkObject* pNetworkObject ); static VOID DestroyClientSideConnectedObject( NetworkObject* pNetworkObject ); // ========================================================================================================= // public: inline eSERVER_TYPE GetServerType() { return AGENT_SERVER; } protected: virtual BOOL Init(); virtual BOOL Update( DWORD dwTick ); virtual VOID Release(); virtual BOOL KeyEvent( CHAR ch ); public: virtual ServerSession* AllocServerSession( eSERVER_TYPE serverType ); virtual VOID FreeServerSession( ServerSession* pServerSession ); // // ========================================================================================================= public: BOOL ConnectTo( eSERVER_TYPE serverType ); BOOL IsConnectedTo( eSERVER_TYPE eServerType ); // ========================================================================================================= // BOOL SendToServerByIndex( eSERVER_TYPE stServerType, MSG_BASE* pMsg, WORD wSize ); inline BOOL SendToMasterServer( MSG_BASE* pMsg, WORD wSize ) { return SendToServerByIndex( MASTER_SERVER, pMsg, wSize ); } inline BOOL SendToDBPServer( MSG_BASE* pMsg, WORD wSize ) { return SendToServerByIndex( GAME_DBPROXY, pMsg, wSize ); } BOOL SendToAuthAgentServer( BYTE* pMsg, WORD wSize ); inline BOOL SendToWorldServer( MSG_BASE* pMsg, WORD wSize ) { return SendToServerByIndex( WORLD_SERVER, pMsg, wSize ); } // ¿¬°áµÇ¾îÀÖ´Â Çʵå, ¹èƲ¼­¹ö¿¡ ÆÐŶÀ» º¸³½´Ù. VOID SendToGameServer( MSG_BASE* pMsg, WORD wSize ); MasterServerSession* SessionMasterServer() { return (MasterServerSession*)m_pServerSessions[MASTER_SERVER]; } AuthAgentServerSession* SessionAuthAgentServer() { return (AuthAgentServerSession*)m_pServerSessions[AUTH_AGENT_SERVER]; } DBProxyServerSession* SessionDBProxyServer() { return (DBProxyServerSession*)m_pServerSessions[GAME_DBPROXY]; } WorldServerSession* SessionWorldServer() { return (WorldServerSession*)m_pServerSessions[WORLD_SERVER]; } inline eSERVER_STATE GetDBProxyServerState() { return m_eDBPState; } inline VOID SetDBProxyServerState( eSERVER_STATE eDBPState ){ m_eDBPState = eDBPState; } int GetDBConnectorIndex() const { return db_connector_index_; }; void ChangeDBConnectorIndex(int db_connector_index) { db_connector_index_ = db_connector_index; } CHAR* GetWorldServerClientIP() { return m_pszWorldServerClientIP; } WORD GetWorldServerClientPort() { return m_wWorldServerClientPort; } BOOL SetWorldServerClientAddr( CHAR* pIP, WORD wPort ) { if( pIP && wPort ) { strncpy( m_pszWorldServerClientIP, pIP, sizeof(m_pszWorldServerClientIP) ); m_pszWorldServerClientIP[MAX_IP_STRING_LEN] = '\0'; m_wWorldServerClientPort = wPort; return TRUE; } else { memset( m_pszWorldServerClientIP, 0, sizeof(m_pszWorldServerClientIP) ); m_wWorldServerClientPort = 0; } return FALSE; } VOID StartServerSideListen(); VOID StartClientSideListen(); // // ========================================================================================================= // ÀÎÁõÂʰú Åë½Å½Ã¿¡ ÇÊ¿äÇÑ... WORK_KEY GetPeriodicWorkKey() { return m_wkPeriodicWorkKey; } public: static sCLIENT_INIT_PRE_ENTRY_WRAP* GetGResource(); #if USING_HACKSHIELD static AHNHS_SERVER_HANDLE GetHANDLEofHS(); #elif USING_XIGNCODE #elif USING_FROST #endif public: BOOL IsPVPMode(){ return m_bPVPMode; } // ========================================================================================================= // public: inline ePHASE_SHIFT GetPhaseStatus() { return m_PHASE_SHIFT; } inline VOID SetPhaseStatus( ePHASE_SHIFT phase ) { m_PHASE_SHIFT = phase; } static VOID StartServer(); VOID DoFinalize(); private: VOID Init_ClearFields(); BOOL Init_PoolInfo(); BOOL Init_ScriptData( BOOL bReadFromFile ); BOOL Init_Logger(); BOOL Init_SecureLogic(); // // ========================================================================================================= private: typedef util::PoolRouter SERVER_SESSION_ROUTER; SERVER_SESSION_ROUTER& GetServerPoolRouter() { return *m_pServerPoolRouter; } ////////////////////////////////////////////////////////////////////////// // private: SERVER_SESSION_ROUTER* m_pServerPoolRouter; struct { // SolarAuth °ü·Ã FIELDs ePHASE_SHIFT m_PHASE_SHIFT; BOOL m_bServiceMode; }; BOOL m_bPVPMode; ScriptParserManager* m_pAgentScriptParserManager; struct { // Connection °ü·Ã FIELDs eSERVER_STATE m_eDBPState; int db_connector_index_; //_NA000000_DBQUERY_REVERSAL_STATE_PREVENTION ServerSessionEx* m_pServerSessions[MAX_SERVER]; }; ////////////////////////////////////////////////////////////////////////// // public: cEXITINFO_OF_AGENTSERVER SERVER_EXIT; // ¼­¹ö Á¾·á ó¸® ·çƾ private: struct { // Ãß°¡ ÀÚ·áÇü BOOL m_bShutDownProcess; DWORD m_dwShutdownDelayTime; // ¼­¹ö Á¾·á ´ë±â ½Ã°£ DWORD m_dwStartTimeForShutdown; // ¼­¹ö Á¾·á ½ÃÀÛ ½Ã°£ ////////////////////////////////////////////////////////////////////////// util::Timer m_TimerUserCountReport; }; struct { CHAR m_pszWorldServerClientIP[MAX_IP_STRING_LEN+1]; WORD m_wWorldServerClientPort; }; struct { util::Timer m_BattleJoinTimer; util::Timer m_RegisterTimer; }; struct { // (KEYWORD:CCU) WorkLoad Key WORK_KEY m_wkPeriodicWorkKey; }; // // // // // // // // // static AgentServer* instance_; private: // VOID DisplayPoolInfo(); //_NA_000000_20150507_TIME_DISPLAY VOID DisplayCurrentServerTime(); public: //inline BOOL IsShutDown() { return GetStartTimeForShutdown()!=0; } //inline VOID StartShutdown() { SetStartTimeForShutdown(GetTickCount()); } //__PROPERTY( DWORD, ShutdownDelayTime ); //__PROPERTY( DWORD, StartTimeForShutdown ); // // // // // // // // // };