//============================================================================================================================= /// SolarAuthServer class /** @author Lee Eun-pa @since 2006. 08. 11 @remark - SolarAuthServer @note @history - */ //============================================================================================================================= // SolarAuthServer.cpp : ÄÜ¼Ö ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ´ëÇÑ ÁøÀÔÁ¡À» Á¤ÀÇÇÕ´Ï´Ù. // #include "stdafx.h" #include #include #include #include #include //========================================================================================================= // SolarAuthServer Include Files // #include "SolarAuthServer.h" #include "Sessions/ServerSession.h" #include "Sessions/ServerSessionManager.h" #include "PacketHandler/PacketHandler.h" #include "Information/ScriptLoadManager.h" #include #include // //========================================================================================================= #define SOLAR_AUTH_SERVER_INFO_FILE_NAME ".\\SolarAuthServer.ini" //=================================================================================================== // // SolarAuthServer::SolarAuthServer() { m_bShutdown = FALSE; } SolarAuthServer::~SolarAuthServer() { } BOOL SolarAuthServer::Init() { // (¼­ºñ½º/ÄܼÖ)¸ðµå Á¦¾î È®ÀÎÇÒ °Í. __READ_CONFIG_NUMBER( m_bServiceMode, "COMMON", "SERVICE_MODE", 0, SOLAR_AUTH_SERVER_INFO_FILE_NAME ); //UINT value; //__READ_CONFIG_NUMBER( value, "COMMON", "S", 0, SOLAR_AUTH_SERVER_INFO_FILE_NAME ); //m_ServerMode = (eSERVER_MODE)value; nsPacket::Environment::Init(); WorkLoadManager::CreateInstance(); //------------------------------------------------------------------------------------------------- // <4> SunLog InitializeLogger(); ScriptLoadManager* pScriptManager = ScriptLoadManager::Instance(); pScriptManager->Initialize( "SolarAuthServer.EncryptedInfo.ini", //°¢±â ¼­·Î ´Ù¸¥ ÅÇÀ» ÀоîµéÀδÙ. "SolarAuthServer.EncryptedInfo.ini", //°¢±â ¼­·Î ´Ù¸¥ ÅÇÀ» ÀоîµéÀδÙ. "EncryptedScriptList.ini" ); ERROR_PARSER( pScriptManager->LoadSolarAuthInfo() ); ERROR_PARSER( pScriptManager->LoadAcceptableMasterServerList() ); ERROR_PARSER( pScriptManager->LoadData() ); // ERROR_PARSER( pScriptManager->LoadServerListPerMaster() ); // ¼­¹ö ȯ°æÀ¸·ÎºÎÅÍ? ¾Æ´Ô º°µµÀÇ Á¤º¸·ÎºÎÅÍ ÇØ´ç ³»¿ëÀ» ÀоîµéÀδÙ. eCODE_NATION nationCode; // m_pSolarAuthInfoParser->GetNationCode(); eCODE_REGION regionCode; // m_pSolarAuthInfoParser->GetNationCode(); eMODE_SERVER serverMode; // m_pSolarAuthInfoParser->GetNationCode(); PADDING_T padType = 0; m_GlobalServerKey.Set( nationCode, regionCode, serverMode, padType ); // SetChannelID( pServerEnv->wSolarAuthServerID ); //< ä³Î ID //m_ServerKey.Set( (BYTE)m_ServerKey.GetWorldID(), (BYTE)pServerEnv->wSolarAuthServerID, (BYTE)GetServerType(), (BYTE)m_ServerKey.GetServerID() ); //------------------------------------------------------------------------------------------------- // <6> Network°ü·Ã ÃʱâÈ­ // SessionManager // Init. Network Engine PacketHandler::RegisterHandler(); ServerSessionManager::Instance(); m_MasterServerPool.Initialize( 20, 10 ); m_TempServerPool.Initialize( 20, 10 ); m_ADBPServerPool.Initialize( 1 ); //------------------------------------------------------------------------------------------------- // <6> ·ÎÄÿ¡¼­ Á¢±ÙÇÏ´Â ¸ñ·ÏÀÌ ÀÖ´Â °æ¿ì ÁÖ¼Ò ¼³Á¤ // //------------------------------------------------------------------------------------------------- // <7> ÆÐŶ ¾Ïȣȭ¸¦ À§ÇÑ È¯°æ ¼³Á¤ // // À̰ÍÀº TempServer¿¡¼­ ¸¶½ºÅͼ­¹ö·Î ÀÎÁ¤¹Þ°Ô µÉ °æ¿ì, ÆÐŶÀ» ¾Ïȣȭ ÇÏ´Â °úÁ¤±îÁö¸¦ °ÅÄ£´Ù. /* // ÆÐŶ ¾Ïȣȭ Àû¿ë ¿©ºÎ ¼³Á¤ if( pServerEnv->CryptographyIsEnabled() ) User::CryptographyEnabledByEnv(); if( pServerEnv->CryptographyKeyChangeIsEnabled() ) { User::CryptographyKeyChangeEnabledByEnv( pServerEnv->dwCrypto_KeyChange_Interval ); UserCrypts::GetCryptUpdateTimer().SetTimer( pServerEnv->dwCrypto_KeyChange_Interval ); } */ do { //__NA000000_070523_REPORT_TO_SOLARAUTH ReportFromMasters* pWorkNode = new ReportFromMasters(); m_wkReportWorkKey = WorkLoadManager::RegisterTask( pWorkNode ); if( WorkLoadManager::c_NotExistKey == m_wkReportWorkKey ) { MessageOut( eCRITICAL_LOG, _T("Can't Create Report WorkNode") ); return FALSE; } } while(0); #if !defined(__WAVERIX_SERVER_AUTHENTICATION_BY_SOLARAUTH__) SolarAuthServer::StartServer(); #endif //__WAVERIX_SERVER_AUTHENTICATION_BY_SOLARAUTH__ return TRUE; } VOID SolarAuthServer::Release() { //m_bShutdown = TRUE; //SAFE_DELETE(m_pFileParser); SAFE_DELETE(g_pSunLog); // Ä¿³ØÆ®¿¡ ÀÌ¿ëÇÑ ¼¼¼Ç °´Ã¼ ¹Ýȯ // ÀÖÀ¸¸é... WorkLoadManager::DestroyInstance(); PacketHandler::ClosePacketHandler(); } VOID SolarAuthServer::Finalize() { ServerSessionManager::DestroyInstance(); ScriptLoadManager::DestroyInstance(); } VOID SolarAuthServer::StartServer() { Listen( SERVER_IOHANDLER ); } BOOL SolarAuthServer::Update( DWORD tick ) { // <2> Server Session °ü¸® WorkLoadManager::Update(); // ServerSessionManager::Instance()->Update(); // <4> ÁÖ±âÀû ۱³È¯... ÇÊ¿äÇѰ¡? ŸÀüÇÒ °Í. //if( User::CryptographyKeyChangeIsEnabledByEnv() ) //{ // if( UserCrypts::GetCryptUpdateTimer().IsExpired( TRUE ) ) // { // UserCrypts::Update(); // } //} // SunLog Update À§Ä¡³ª Á¾·á½ÃÁ¡ÀÇ ·Î±× ¾²±â µîÀ» °í·ÁÇØ¼­ Àç¼³Á¤ÇÒ °Í. g_pSunLog->Update(); return TRUE; } VOID SolarAuthServer::DisplayPoolInfo() { //DISPMSG( "================= Pool Info =================\n" ); //g_ZoneManager.DisplayerZonePoolInfo(); //g_UserFactory.DisplayPoolInfo(); //PartyManager::Instance()->DisplayPoolInfo(); } VOID SolarAuthServer::DisplayServerInfo() { DISPMSG( "============== SolarAuthServer ==============\n" ); // DISPMSG( "Frame Per Second : %d\n" , m_dwFPS ); DISPMSG( "Server Connections : %d\n" , GetIOCPServer()->GetNumberOfConnections( OUTSIDE_IOHANDLER ) ); DISPMSG( "Master Server Connections : %d\n" , GetIOCPServer()->GetNumberOfConnections( INSIDE_IOHANDLER ) ); } VOID SolarAuthServer::DisplayServerListInfo() { int iWritten=0; int iServerCounts = GetIOCPServer()->GetNumberOfConnections( OUTSIDE_IOHANDLER ); const int iMaxStr = 4095; const CHAR* strfmtServerInfo = "[%02u] %-24s: %s:%05u\n"; const CHAR* strfmtServerIPInfo = "[%02u] %-24s: %u.%u.%u.%u:%05u\n"; CHAR strServerInfo[iMaxStr+((int)sizeof(CHAR))]; // 4096 // UNICODE¿¡ ÁÖÀÇÇÒ °Í iWritten += _snprintf( strServerInfo, iMaxStr, "============= Connected MasterServer Session List ==============\n" ); DWORD count = 0; SERVER_SESSION_CONTAINER_DELEGATOR pSessionList = ServerSessionManager::Instance()->GetConnectedServerList(); SERVER_SESSION_CONTAINER_ITER it, end(pSessionList->end()); for( it = pSessionList->begin() ; it != end ; ++it ) { SERVER_SESSION_DELEGATOR pServerSession = it->second; TCHAR* ptstr = GetServerType2String( pServerSession->GetServerType() ); WORD wConnPort = pServerSession->GetConnectPort(); if( wConnPort ) { iWritten += _snprintf( strServerInfo+iWritten, iMaxStr-iWritten, strfmtServerInfo, pServerSession->GetSessionIndex(), ptstr, pServerSession->GetConnectIP().c_str(), wConnPort ); } else { union { DWORD dwAddr; BYTE byAddrT[4]; } uAddr; uAddr.dwAddr = pServerSession->GetIPAddress(); WORD wPort = pServerSession->GetPort(); iWritten += _snprintf( strServerInfo+iWritten, iMaxStr-iWritten, strfmtServerIPInfo, pServerSession->GetSessionIndex(), ptstr, uAddr.byAddrT[0], uAddr.byAddrT[1], uAddr.byAddrT[2], uAddr.byAddrT[3], wPort ); } ++count; } iWritten += _snprintf( strServerInfo+iWritten, iMaxStr-iWritten, " Connected Session Counts : %3d\n", count ); iWritten += _snprintf( strServerInfo+iWritten, iMaxStr-iWritten, "================================================================\n\n" ); // ¸ñ·ÏÀ» ±¸ÇÏ·Á¸é? //iWritten = _snprintf( strfmtServerInfo+iWritten, iMaxStr, strfmtServerInfo, if( iWritten < 0 ) // ±×·² °¡´É¼ºÀÌ Àִ°¡? ¾øÀ» °ÍÀÌÁö¸¸...-_-;;; { SUNLOG( eCRITICAL_LOG, "¼­¹ö ¸ñ·Ï ¹öÆÛ Full" ); } // iWritten += _snprintf( strServerInfo+iWritten, iMaxStr-iWritten, "===================== Session Buffer Info =====================\n" ); for( it = pSessionList->begin() ; it != end ; ++it ) { SERVER_SESSION_DELEGATOR pServerSession = it->second; DWORD dwCurSendBuffer = GetIOCPServer()->GetCurSendBuffer( OUTSIDE_IOHANDLER, pServerSession->GetSessionIndex() ); DWORD dwCurRecvBuffer = GetIOCPServer()->GetCurRecvBuffer( OUTSIDE_IOHANDLER, pServerSession->GetSessionIndex() ); iWritten += _snprintf( strServerInfo+iWritten, iMaxStr-iWritten, "SessionIndex[%d] dwCurSendBuffer[%d] : dwCurRecvBuffer[%d] \n", pServerSession->GetSessionIndex(), dwCurSendBuffer, dwCurRecvBuffer ); } iWritten += _snprintf( strServerInfo+iWritten, iMaxStr-iWritten, "===============================================================\n" ); puts( strServerInfo ); } //VOID SolarAuthServer::Shutdown() {} ServerSession* SolarAuthServer::AllocServerSession( eSERVER_TYPE serverType ) { SERVER_SESSION_DELEGATOR pServerSession = (ServerSessionEx*)SolarAuthServer::Handler_AllocServerSession_NoInit( serverType ); if( pServerSession() ) ((ServerSession*)pServerSession())->Init( this ); return (ServerSession*)pServerSession(); } VOID SolarAuthServer::FreeServerSession( ServerSession* pServerSession ) { SolarAuthServer::Handler_FreeServerSession_NoRelease( pServerSession ); } ///------------------------------------------------------------------------------------------------ /// Ŭ¶óÀ̾ðÆ®ÂÊ Äݹé (À̰ÍÀº ¾Ï½ÃÀûÀ¸·Î ¿ÜºÎ·ÎºÎÅÍ µé¾î¿À´Â ¼­¹ö¸¦ ÀǹÌÇÑ´Ù.) //NetworkObject* SolarAuthServer::CreateClientSideAcceptedObject() //{ // ServerSession* pServerSession = ServerSessionFactory::Instance()->AllocServerSession( TEMP_SERVER ); // return (NetworkObject*)pServerSession; //} // //VOID SolarAuthServer::DestroyClientSideAcceptedObject( NetworkObject* pNetworkObject ) //{ // ServerSession* pServerSession = (ServerSession*)pNetworkObject; // ServerSessionFactory::Instance()->FreeServerSession( (ServerSession*)pNetworkObject ); //} // //VOID SolarAuthServer::DestroyClientSideConnectedObject( NetworkObject* pNetworkObject ) //{ // __UNUSED(pNetworkObject); //} // // BOOL SolarAuthServer::KeyEvent( CHAR ch ) { switch(ch) { case 'L': //¿¬°áµÈ ¼­¹öµé ¸ñ·Ï º¸¿©ÁÖ±â { DisplayServerListInfo(); } break; case 'C': { //DISPMSG( "============== Client Buffer Info ============================\n" ); //m_pIOCPServer->Display( INSIDE_IOHANDLER, 5000 ); //DISPMSG( "===============================================================\n" ); } break; case 'S': //Show Packet Stream in User { //DisplayPacketStream(); #ifdef _DEBUG //PACKET_CONTROL::SetShowPacketStream( !PACKET_CONTROL::GetShowPacketStream() ); #endif } break; case 'P': { DisplayPoolInfo(); }break; case 'Q': { //MSG_CG_CONNECTION_RESTART_CMD msg; } break; case 'Y': { } break; } return TRUE; } //==================================================================================================================================== // Network Manatain // //VOID SolarAuthServer::Listen( eIOHANDLER where ) //{ // if( BOTH_IOHANDLER == where || OUTSIDE_IOHANDLER == where ) // { // if( m_wOutSideListenPort && !m_pIOCPServer->IsListening( OUTSIDE_IOHANDLER ) ) // { // DISPMSG( "[SolarAuthServer::StartListen]\n\tStarting Out-side listen(%s:%d)...", m_pszOutSideListenIP, m_wOutSideListenPort ); // if( !m_pIOCPServer->StartListen( OUTSIDE_IOHANDLER, m_pszOutSideListenIP, m_wOutSideListenPort ) ) // { // DISP_FAIL; // } // else // { // DISP_OK; // } // } // } // // if( BOTH_IOHANDLER == where || INSIDE_IOHANDLER == where ) // { // if( m_wInSideListenPort && !m_pIOCPServer->IsListening( INSIDE_IOHANDLER ) ) // { // DISPMSG( "[SolarAuthServer::StartListen]\n\tStarting In-side listen(%s:%d)...", m_pszInSideListenIP, m_wInSideListenPort ); // if( !m_pIOCPServer->StartListen( INSIDE_IOHANDLER, m_pszInSideListenIP, m_wInSideListenPort ) ) // { // DISP_FAIL; // } // else // { // DISP_OK; // } // } // } //} VOID SolarAuthServer::Connect() { ASSERT( "È®ÀÎÇÏÀÚ!" ); /* INT ServerType = UNKNOWN_SERVER; char pszSectionName[16] = {'\0',}; char pszConnectIP[32] = {'\0',}; WORD wConnectPort = 0; INT nMax = m_nConnectionNum; if( !m_bGetServerInfoFromFile) { while( 0 < nMax-- ) { _snprintf( pszSectionName, 16, "CONNECTION_%d", nMax ); __READ_CONFIG_STRING_IP( pszConnectIP, pszSectionName, "IP", NULL ); __READ_CONFIG_NUMBER( wConnectPort, pszSectionName, "PORT", 0 ); __READ_CONFIG_NUMBER( ServerType, pszSectionName, "TYPE", 0 ); ServerSession * pSession = ServerSessionManager::Instance()->AllocServerSession( (eSERVER_TYPE)ServerType ); ASSERT( pSession && "¼­¹öŸÀÔÀÌ À߸øµÇ¾ú½À´Ï´Ù.GuildServer.ini ¿À·ù!" ); if( ServerType == GAME_DBPROXY ) { m_pDBProxyServerSession = pSession; } if( ServerType == MASTER_SERVER ) { m_pMasterServerSession = pSession; } if( ServerType == WORLD_SERVER ) { m_pWorldServerSession = pSession; } // Master Server ¾Æ´Ï¸é ¹«½Ã if( ServerType != MASTER_SERVER ) { continue; } ASSERT( wConnectPort != 0 && " Æ÷Æ®°¡ 0ÀÔ´Ï´Ù.GuildServer.ini ¿À·ù!" ); m_pMasterServerSession->SetAddr( pszConnectIP, wConnectPort ); Connect( m_pMasterServerSession, pszConnectIP, wConnectPort ); } } else { while( 0 < nMax-- ) { _snprintf( pszSectionName, 16, "CONNECTION_%d", nMax ); __READ_CONFIG_STRING_IP( pszConnectIP, pszSectionName, "IP", NULL ); __READ_CONFIG_NUMBER( wConnectPort, pszSectionName, "PORT", 0 ); __READ_CONFIG_NUMBER( ServerType, pszSectionName, "TYPE", 0 ); ASSERT( wConnectPort != 0 && " Æ÷Æ®°¡ 0ÀÔ´Ï´Ù.GuildServer.ini ¿À·ù!" ); // Master Server ¿¬°á ¿©ºÎ! if( ServerType == MASTER_SERVER ) { if(m_bGetServerInfoFromFile) continue; } ServerSession * pSession = ServerSessionManager::Instance()->AllocServerSession( (eSERVER_TYPE)ServerType ); ASSERT( pSession && "¼­¹öŸÀÔÀÌ À߸øµÇ¾ú½À´Ï´Ù.GuildServer.ini ¿À·ù!" ); pSession->SetAddr( pszConnectIP, wConnectPort ); Connect( pSession, pszConnectIP, wConnectPort ); // TO DO : if( ServerType == GAME_DBPROXY ) { m_pDBProxyServerSession = pSession; } if( ServerType == MASTER_SERVER ) { m_pMasterServerSession = pSession; } if( ServerType == WORLD_SERVER ) { m_pWorldServerSession = pSession; } } } */ } VOID SolarAuthServer::Connect( const ServerSession* pNetObject, CHAR* IN pszIP, const WORD wPort ) { ASSERT( "È®ÀÎÇÏÀÚ!" ); if( GetIOCPServer() && pNetObject ) { GetIOCPServer()->Connect( INSIDE_IOHANDLER, (NetworkObject*)pNetObject, pszIP, wPort); } } //============================================================================================================ // Logger Initializer // BOOL SolarAuthServer::InitializeLogger() { BYTE bySunLogOption = 0; BYTE bySunLogFileLevel = 0; CHAR pszSunLogFilePath[32]; __READ_CONFIG_NUMBER( bySunLogOption, "LOGFILE", "SUN_LOGFILE_OPTION", 0, SOLAR_AUTH_SERVER_INFO_FILE_NAME ); __READ_CONFIG_NUMBER( bySunLogFileLevel, "LOGFILE", "SUN_LOGFILE_LEVEL", 0, SOLAR_AUTH_SERVER_INFO_FILE_NAME ); __READ_CONFIG_STRING( pszSunLogFilePath, "LOGFILE", "SUN_LOGFILE_PATH", NULL, SOLAR_AUTH_SERVER_INFO_FILE_NAME ); DISPMSG( "SUNLOG Initializing...\t" ); g_pSunLog = new CSunLog; BOOL bRet = g_pSunLog->Init( bySunLogOption, bySunLogFileLevel, pszSunLogFilePath, "SolarAuth" ); if( bRet ) { DISP_OK; } else { DISP_FAIL; } return bRet; }