#include "stdafx.h" #include "SunUpdateServer.h" #include #include #include #include "ServerScriptParser.h" #include "ServerStruct.h" #include #include "PacketHandler.h" #include "UserSessionFactory.h" #include "UserManager.h" #include "ServerSessionFactory.h" #include "ServerSessionManager.h" #include "UserInfoParser.h" #include "ServerInfoParser.h" #include "AgentInfoParser.h" #include "AccessInfoParser.h" #include "WorldManager.h" #include "FtpInfoParser.h" #ifdef _NA_006543_20130318_HEARTBEAT #include "ServerSessionManager.h" #endif /************************************************************************/ /* ÄݹéÇÔ¼ö */ /************************************************************************/ NetworkObject* CreateClientSideAcceptedObject(); VOID DestroyClientSideAcceptedObject( NetworkObject * pNetworkObject ); VOID DestroyClientSideConnectedObject( NetworkObject * pNetworkObject ); NetworkObject* CreateServerSideAcceptedObject(); VOID DestroyServerSideAcceptedObject( NetworkObject * pNetworkObject ); VOID DestroyServerSideConnectedObject( NetworkObject * pNetworkObject ); SunUpdateServer::SunUpdateServer() { m_pIOCPServer = NULL; m_bIsShutDown = FALSE; m_dwFPS = 0; } SunUpdateServer::~SunUpdateServer() { } VOID SunUpdateServer::Release() { //------------------------------------------------------------------------------------------------- // IOCP ÇØÁ¦ //------------------------------------------------------------------------------------------------- if( m_pIOCPServer ) { m_pIOCPServer->Shutdown(); SAFE_DELETE( m_pIOCPServer ); } ServerSessionFactory::Instance()->DestroyInstance(); ServerSessionManager::Instance()->Release(); ServerSessionManager::Instance()->DestroyInstance(); UserSessionFactory::Instance()->Release(); UserSessionFactory::Instance()->DestroyInstance(); UserManager::Instance()->Release(); UserManager::Instance()->DestroyInstance(); UserInfoParser::DestroyInstance(); ServerInfoParser::DestroyInstance(); AgentInfoParser::DestroyInstance(); PacketHandler::Instance()->DestroyInstance(); WorldManager::Instance()->Release(); WorldManager::DestroyInstance(); } BOOL SunUpdateServer::Init() { ////////////////////////////////////////////////////////////////////////// // XML µ¥ÀÌÅÍ ÆÄ½Ì if( !UserInfoParser::Instance()->Load( "UserInfo.xml" ) ) { MessageBox( NULL, "UserInfo.xml ·Îµå ½ÇÆÐ", NULL, MB_OK ); return FALSE; } if( !ServerInfoParser::Instance()->Load( "ServerInfo.xml") ) { MessageBox( NULL, "ServerInfo.xml ·Îµå ½ÇÆÐ", NULL, MB_OK ); return FALSE; } if( !AgentInfoParser::Instance()->Load( "AgentInfo.xml") ) { MessageBox( NULL, "AgentInfo.xml ·Îµå ½ÇÆÐ", NULL, MB_OK ); return FALSE; } if( !AccessInfoParser::Instance()->Load( "AccessInfo.xml") ) { MessageBox( NULL, "AccessInfo.xml ·Îµå ½ÇÆÐ", NULL, MB_OK ); return FALSE; } if( !FtpInfoParser::Instance()->Load( "FTPInfo.xml") ) { MessageBox( NULL, "FTPInfo.xml ·Îµå ½ÇÆÐ", NULL, MB_OK ); return FALSE; } // World, Channel, UnitServer ±¸¼º WorldManager::Instance()->MakeWorld(); ////////////////////////////////////////////////////////////////////////// // ¼­¹ö ½ºÅ©¸³Æ® ÀÐ°í ±¸Á¶Ã¼¿¡ Àû¿ë. if( !ServerScriptParser::Instance()->Load("./UpdateServer.ini") ) { MSGOUT( "UpdateServer.ini ·Îµå ½ÇÆÐ" ); return FALSE; } SERVER_ENV* pServerEnv = ServerScriptParser::Instance()->GetServerEnv(); if( !pServerEnv ) { MSGOUT( "pServerEnv °¡Á®¿À±â ½ÇÆÐ" ); return FALSE; } ////////////////////////////////////////////////////////////////////////// // Factory Creator ServerSessionFactory::Instance()->Init( pServerEnv->ServerIoHandler.dwMaxAcceptSession ); UserSessionFactory::Instance()->Init( pServerEnv->ClientIoHandler.dwMaxAcceptSession ); UserManager::Instance()->Init( pServerEnv->ClientIoHandler.dwMaxAcceptSession ); IOHANDLER_DESC desc[2]; desc[0].dwIoHandlerKey = CLIENT_IOHANDLER; desc[0].dwMaxAcceptSession = pServerEnv->ClientIoHandler.dwMaxAcceptSession; desc[0].dwMaxConnectSession = pServerEnv->ClientIoHandler.dwMaxConnectSession; desc[0].dwSendBufferSize = pServerEnv->ClientIoHandler.dwSendBufferSize; desc[0].dwRecvBufferSize = pServerEnv->ClientIoHandler.dwRecvBufferSize; desc[0].dwTimeOut = pServerEnv->ClientIoHandler.dwTimeOut; desc[0].dwNumberOfAcceptThreads = pServerEnv->ClientIoHandler.dwNumberOfAcceptThreads; desc[0].dwNumberOfIoThreads = pServerEnv->ClientIoHandler.dwNumberOfIoThreads; desc[0].dwNumberOfConnectThreads = pServerEnv->ClientIoHandler.dwNumberOfConnectThreads; desc[0].dwMaxPacketSize = pServerEnv->ClientIoHandler.dwMaxPacketSize; desc[0].fnCreateAcceptedObject = CreateClientSideAcceptedObject; desc[0].fnDestroyAcceptedObject = DestroyClientSideAcceptedObject; desc[0].fnDestroyConnectedObject = DestroyClientSideConnectedObject; m_strOutSideIP = pServerEnv->ClientIoHandler.szIP; m_wOutSidePort = pServerEnv->ClientIoHandler.wPort; desc[1].dwIoHandlerKey = SERVER_IOHANDLER; desc[1].dwMaxAcceptSession = pServerEnv->ServerIoHandler.dwMaxAcceptSession; desc[1].dwMaxConnectSession = pServerEnv->ServerIoHandler.dwMaxConnectSession; desc[1].dwSendBufferSize = pServerEnv->ServerIoHandler.dwSendBufferSize; desc[1].dwRecvBufferSize = pServerEnv->ServerIoHandler.dwRecvBufferSize; desc[1].dwTimeOut = pServerEnv->ServerIoHandler.dwTimeOut; desc[1].dwNumberOfAcceptThreads = pServerEnv->ServerIoHandler.dwNumberOfAcceptThreads; desc[1].dwNumberOfIoThreads = pServerEnv->ServerIoHandler.dwNumberOfIoThreads; desc[1].dwNumberOfConnectThreads = pServerEnv->ServerIoHandler.dwNumberOfConnectThreads; desc[1].dwMaxPacketSize = pServerEnv->ServerIoHandler.dwMaxPacketSize; desc[1].fnCreateAcceptedObject = CreateServerSideAcceptedObject; desc[1].fnDestroyAcceptedObject = DestroyServerSideAcceptedObject; desc[1].fnDestroyConnectedObject = DestroyServerSideConnectedObject; m_strInSideIP = pServerEnv->ServerIoHandler.szIP; m_wInnerPort = pServerEnv->ServerIoHandler.wPort; m_pIOCPServer = new IOCPServer; if( !m_pIOCPServer->Init( desc, 2 ) ) return FALSE; MSGOUT( ">> client-side max connection: accept(%d), connect(%d)", desc[0].dwMaxAcceptSession, desc[0].dwMaxConnectSession ); MSGOUT( ">> server-side max connection: accept(%d), connect(%d)", desc[1].dwMaxAcceptSession, desc[1].dwMaxConnectSession ); //ServerListen Start StartServerSideListen(); //UserListen Start StartClientSideListen(); return TRUE; } BOOL SunUpdateServer::Update() { if( IsShutDown() ) return FALSE; m_pIOCPServer->Update(); UpdateFPS(); #ifdef _NA_006543_20130318_HEARTBEAT ServerSessionManager::Instance()->update(); #endif return TRUE; } VOID SunUpdateServer::Run() { while( TRUE ) { Sleep( 1 ); if( !Update() ) break; if( !ProcessConsole() ) return; } } VOID SunUpdateServer::UpdateFPS() { // FPS Check static int cnt = 0; static DWORD prevTick = GetTickCount(); cnt++; DWORD curTick = GetTickCount(); if( prevTick + 1000 < curTick ) { m_dwFPS = cnt; //printf( "%d FPS", cnt ); prevTick = curTick; cnt = 0; if( m_dwFPS < 10 ) { DISPMSG( "============================================================\n" ); DISPMSG( "[SunUpdateServer::UpdateFPS] FPS Warning!!! [%d] \n", m_dwFPS ); DISPMSG( "============================================================\n" ); } } } VOID SunUpdateServer::DisplayServerInfo() { DISPMSG( "============== SunUpdateServer ==============\n" ); DISPMSG( "Frame Per Second : %d\n", m_dwFPS ); DISPMSG( "Server Connections : %d\n", m_pIOCPServer->GetNumberOfConnections( SERVER_IOHANDLER ) ); DISPMSG( "Player Connections : %d\n", UserManager::Instance()->GetNumberOfUsers() ); } BOOL SunUpdateServer::ProcessConsole() { if( kbhit() ) { char ch = getch(); ch = toupper(ch); switch( ch ) { case 0x1b: return FALSE; case ' ': DisplayServerInfo(); break; default: break; } } return TRUE; } VOID SunUpdateServer::StartServerSideListen() { if( !m_pIOCPServer->IsListening( SERVER_IOHANDLER ) ) { MSGOUT( "[SunUpdateServer::StartServerSideListen] Starting ServerSideListen(%s@%d)...", m_strInSideIP.c_str(), m_wInnerPort ); if( !m_pIOCPServer->StartListen( SERVER_IOHANDLER, const_cast(m_strInSideIP.c_str()), m_wInnerPort ) ) { MSGOUT( "[SunUpdateServer::StartServerSideListen] Fail"); return ; } MSGOUT( "[SunUpdateServer::StartServerSideListen] Success"); } } VOID SunUpdateServer::StartClientSideListen() { if( !m_pIOCPServer->IsListening( CLIENT_IOHANDLER ) ) { MSGOUT( "[SunUpdateServer::StartClientSideListen] Starting ClientSidelisten(%s@%d)...", m_strOutSideIP.c_str(), m_wOutSidePort ); if( !m_pIOCPServer->StartListen( CLIENT_IOHANDLER, const_cast(m_strOutSideIP.c_str()), m_wOutSidePort ) ) { MSGOUT( "[SunUpdateServer::StartClientSideListen] Fail "); return ; } MSGOUT( "[SunUpdateServer::StartClientSideListen] Success "); } } //------------------------------------------------------------------------------------------------ // Ŭ¶óÀÌ¾ðÆ® Äݹé //------------------------------------------------------------------------------------------------ NetworkObject * CreateClientSideAcceptedObject() { return (NetworkObject *)UserSessionFactory::Instance()->AllocUser( UT_TEMP_USER ); } VOID DestroyClientSideAcceptedObject( NetworkObject * pNetworkObject ) { UserSessionFactory::Instance()->FreeUser( (UserSession *)pNetworkObject ); } VOID DestroyClientSideConnectedObject( NetworkObject * pNetworkObject ) { } //------------------------------------------------------------------------------------------------ // ¼­¹ö Äݹé //------------------------------------------------------------------------------------------------ NetworkObject* CreateServerSideAcceptedObject() { //ÇöÀç´Â Agent¼­¹ö¸¸ ÀÖÀ¸¹Ç·Î,... ÀÌ·¸°Ô ÇÑ´Ù.. ¿©·¯°³ÀÇ ¼­¹ö°¡ ÇÊ¿äÇÒ°æ¿ì, TempServer¸¦ ¸¸µéÀÚ. ServerSession * pServerSession = ServerSessionFactory::Instance()->AllocServerSession( UPDATE_TEMP ); return (NetworkObject*)pServerSession; } VOID DestroyServerSideAcceptedObject( NetworkObject * pNetworkObject ) { ServerSession * pServerSession = (ServerSession *)pNetworkObject; ServerSessionFactory::Instance()->FreeServerSession( (ServerSession *)pNetworkObject ); } VOID DestroyServerSideConnectedObject( NetworkObject * pNetworkObject ) { // Nothing to do //ServerSession *pServerSession = (ServerSession*)pNetworkObject; //ServerSessionFactory::Instance()->FreeServerSession( (ServerSession *)pNetworkObject ); }