#include "stdafx.h" #include #include "TempServerSession.h" #include "MasterServerSession.h" #include "ServerSessionManager.h" #include #include TempServerSessionEx::TempServerSessionEx() { Init(); } TempServerSessionEx::~TempServerSessionEx() { Release(); } VOID TempServerSessionEx::Init() { TempServerSession::Init(); m_Services.Init(); m_Services.RegisterPacketHandler(); m_dwPacketStrictSequence = FALSE; m_dwAccessCount = 0; } VOID TempServerSessionEx::Release() { Services().CRYPTINFO.Release(); TempServerSession::Release(); } VOID TempServerSessionEx::MigrateObject( MasterServerSession* pTargetMaster ) { // »õ·Î¿î NetworkObject·Î ±³Ã¼ Redirect( pTargetMaster ); DWORD session_index = this->GetSessionIndex(); // »õ·Î¿î ¼¼¼Ç¿¡ Á¤º¸ º¹»ç pTargetMaster->SetSessionIndex(session_index); GetFrame()->RemoveSession(session_index); MSG_SERVER_TYPE dummy; dummy.m_byCategory = 0; dummy.m_byProtocol = 0; pTargetMaster->OnRedirect(session_index, &dummy); // TempServer Á¤¸®Çϰí Services().MigrateObject(pTargetMaster->Services()); //GLOBAL_SERVER_KEY globalServerKey = Services().GetGlobalServerKey(); } VOID TempServerSessionEx::OnAccept( DWORD dwNetworkIndex ) { TempServerSession::OnAccept( dwNetworkIndex ); ServerSessionManager::Instance()->AddServer( this ); } VOID TempServerSessionEx::OnDisconnect() { ServerSessionManager* pManager = ServerSessionManager::Instance(); SERVER_SESSION_DELEGATOR& rSession = pManager->FindServer( this ); if( rSession == NULL ) { MessageOutEx( g_pSunLog, CSunLog::cCRITICAL_LOG, CSunLog::cOUTPUT_BOTH, CSunLog::cCATE_CONNECTION, "[TempServerSessionEx] ÀÌ¹Ì ÇØÁ¦ÇÑ ¿¬°á¿¡ ´ëÇÑ Á¦°Å¸¦ ¼öÇàÇÏ·Á°í Çϰí ÀÖ´Ù. Idx[%d]", this->GetSessionIndex() ); return; } pManager->RemoveServer( rSession ); TempServerSession::OnDisconnect(); } BOOL TempServerSessionEx::SendPacket( MSG_BASE* pMsg, WORD wSize ) { CryptFlowPolicy::MakePacket::PreSend_DefConverter( (BYTE*)pMsg, m_Services.GetServerIPAddress(), m_Services.GetSeqCryptKey() ); return Send( (BYTE*)pMsg, wSize ); } VOID TempServerSessionEx::OnRecv( BYTE* pMsg, WORD wSize ) { // SolarAuthServer¿¡ Á¢¼ÓÇÏ´Â ¼­¹ö´Â Master¼­¹ö¶ó ÆÇ´ÜÇÑ´Ù. // ÇÏÁö¸¸, Çã¿ëµÈ Master¼­¹öÀÎÁö ¾Æ´ÑÁö È®ÀÎÇÏ´Â ÀýÂ÷°¡ ¿ä±¸µÈ´Ù. // Áï, TempServerSessionExÀ¸·Î Á¢¼ÓÀ» À¯ÁöÇÑ Ã¤ ¿©·¯°¡Áö ÁúÀÇ ¹× ÀÀ´äÀ» ÅëÇØ ÀÎÁõÇÒ Çʿ䰡 ÀÖ´Ù. // // ¾ö°ÝÇÑ ÆÐŶ ¼ø¼­°¡ Á¤ÀÇµÉ °ÍÀÌ´Ù. ÀÌ°Í Àú°Í µé¾î¿Ã ¼ö ÀÖ°Ô µÇ¸é, ÀÚÀ²¼ºÀº ³ô¾ÆÁö°ÚÁö¸¸, // º¸¾È»ó ÇêÁ¡ÀÌ »ý±â±â ¸¶·ÃÀÌ´Ù. // // ÀÏÂ÷ÀûÀ¸·Î »ç¿ëÇÏ´Â °ÍÀº // m_dwPacketStrictSequence : 0~ À¸·Î Çã¿ëÇÏ´Â Çѵµ ³»¿¡¼­ ÀÌ °ªÀº OnRecv½Ã Áõ°¡µÉ °ÍÀÌ´Ù. // ´õ ÇÊ¿äÇÑ ºÎºÐ¿¡ ´ëÇØ¼­´Â Á»´õ °í·ÁÇÑ µÚ °áÁ¤Çϱâ·Î ÇÑ´Ù. ScriptLoadManager* pScriptLoadManager = ScriptLoadManager::Instance(); SolarAcceptableMasterServerListLoaderDelegator& rMasters = pScriptLoadManager->SolarAcceptableMasterServerListLoaderHandle; ACCEPTABLE_MASTER_SERVER_INFO_DELEGATOR& rMasterInfo = rMasters->GetMasterServerByIP( this->GetIPAddress() ); if( rMasterInfo == NULL ) { MessageOutEx( g_pSunLog, CSunLog::cCRITICAL_LOG, CSunLog::cOUTPUT_BOTH, CSunLog::cCATE_CONNECTION, _T("ÀÎÁõµÇÁö ¾ÊÀº ¼­¹ö¿¡¼­ Á¢¼ÓÀ» ¿äûÇß½À´Ï´Ù. IP {%s}"), this->GetIP() ); // ²÷¾î³»¾ß ÇÏÁö¸¸, ¾à°£ÀÇ À¯¿¹±â°£À» µÑ±î? return; } DWORD dwIPAddress = rMasterInfo->GetIPAddress(); CRYPT_KEY_T cryptKey = rMasterInfo->GetCryptKey(); MessageOutEx( g_pSunLog, CSunLog::cCRITICAL_LOG, CSunLog::cOUTPUT_BOTH, CSunLog::cCATE_CONNECTION, _T("IP {%s} IPAddress [%08X] CryptKey [%08X]"), this->GetIP(), dwIPAddress, cryptKey ); Services().SetServerIPAddress( rMasterInfo->m_dwNetworkIP_Server ); // ¾ÆÁ÷ ¾ÏȣȭµÇÁö ¾ÊÀº Á¢¼ÓÀýÂ÷ if( AccessCount() != 0 ) { DWORD dwSeqCryptKey = Services().GetSeqCryptKey(); CryptFlowPolicy::MakePacket::PostRecv_DefConverter( pMsg, /*cryptKey,*/ Services().GetServerIPAddress(), dwSeqCryptKey ); } Services().GetPacketHandler()->ParsePacket( TEMP_SERVER, this, (MSG_BASE*)pMsg, wSize ); // //------------------------------------------------------------------------------------- // // m_dwPacketStrictSequenceÀÇ ¼öÄ¡¿¡ µû¸¥ Çڵ鸵 Á¤Ã¥À» Á¤ÀÇÇÑ´Ù. // // <1> Switch by m_dwPacketStrictSequence // // <1-1> Á¢¼Ó Á¤º¸ È®ÀÎ // // <1-2> »ó´ë¹æÀÌ °®°í ÀÖ´Â (°³º°ÀûÀ¸·Î) ÀÚ½ÅÀÇ Å°Á¤º¸¸¦ ÀÚ½ÅÀÌ ÁØ Á¤º¸·Î º¯È¯ÇØ Àü¼Û // // <1-3> »ó´ë¹æÀÌ º¸³»´Â Á¤º¸¸¦ »ó´ë¹æ¿¡ ´ëÇÑ Å°Á¤º¸·Î º¹¿øÇØ È®ÀÎ // // <1-3-1> T : »ó´ë¹æÀ» ½Å·ÚÇÒ ¼ö ÀÖ´Ù, ÆÐŶ¾Ïȣȭ¿ë Ű Àü¼Û, ¾Ïȣȭ¸¦ °ÅÄ¡´Â Çڵ鷯 µî·Ï // // <1-3-1> F : ½Å·ÚÇÒ ¼ö ¾ø´Â ´ë»ó, ÀÏ´Ü ²÷´Â °ÍÀ¸·Î Çϰí ÀÌÈÄ ºí·Ï ¹× ¸ð´ÏÅ͸µÇÏ´Â Á¤Ã¥ ¼³Á¤ // // <1-4~> ACK, KEY, ACKÀÇ °úÁ¤À» °ÅÃÄ Å°±³È¯À» ¿Ï·áÇÑ´Ù. // // <2> »ó´ë¹æ¿¡°Ô º¸³»ÁÙ ¼ö ÀÖ´Â Çڵ鷯µéÀ» Çã¿ëÇϰí, MasterServer·Î SessionÀüȯ // // // Ç®·ÎºÎÅÍ NetworkObject¸¦ ¹Þ¾Æ ¿Â´Ù. // // MSG_SERVER_TYPE *pRecvMsg = (MSG_SERVER_TYPE *)pMsg; // SERVER_SESSION_DELEGATOR pNewSession = // ServerSessionFactory::Instance()->AllocServerSession( (eSERVER_TYPE)pRecvMsg->m_byServerType ); // // if( pNewSession == NULL ) // { // OnDisconnect(); // return; // } // // »õ·Î¿î NetworkObject·Î ±³Ã¼ // Redirect( pNewSession() ); // // /* // // ¼­¹ö Á¤º¸ Å×ÀÌºí¿¡¼­ IP¿Í ¼­¹ö ŸÀÔÀ¸·Î ¼­¹ö¸¦ ã¾Æ¼­ ±× ۸¦ ¼¼ÆÃÇÑ´Ù. // DWORD dwServerKey = ServerInfoManager::Instance()->GetServerKey( (eSERVER_TYPE)pRecvMsg->m_byServerType, GetIP() ); // pNewSession->SetServerKey( dwServerKey ); // */ // // // »õ·Î¿î ¼¼¼Ç¿¡ Á¤º¸ º¹»ç // pNewSession->SetSessionIndex( GetSessionIndex() ); //// pNewSession->OnRedirect(); // // // TempServer Á¤¸®Çϰí // GLOBAL_SERVER_KEY globalServerKey = this->GetGlobalServerKey(); // this->Release(); // ServerSessionManager::Instance()->RemoveServer( globalServerKey ); // ServerSessionFactory::Instance()->FreeServerSession( this ); // // // ½ÇÁ¦ »ç¿ëÇÒ ¼¼¼ÇÀ» ¸Å´ÏÀú¿¡ Ãß°¡ // ServerSessionManager::Instance()->AddServer( pNewSession ); }