#include "stdafx.h" #include "HeartbeatManager.h" #include // sHEARTBEAT_VALUATION_INFO PROCESS_HEARTBEAT_VALUATION::ms_VALUATION_INFO = { 0, }; PROCESS_HEARTBEAT_VALUATION::sRECORD_INFO PROCESS_HEARTBEAT_VALUATION::ms_RECORD_INFO = { 0, }; // BOOL PROCESS_HEARTBEAT_VALUATION::SetInformation( const sHEARTBEAT_VALUATION_INFO* pVALUATION_INFO ) { sHEARTBEAT_VALUATION_INFO* pINFO = (sHEARTBEAT_VALUATION_INFO*)pVALUATION_INFO; ASSERT( pINFO && pINFO->m_dwValuationPeriod && pINFO->m_dwHeartbeatTick ); if( !(pINFO && pINFO->m_dwValuationPeriod && pINFO->m_dwHeartbeatTick ) ) return FALSE; // m_dwCountPerPeriod = 1; // ¸ðµç À¯ÀúµéÀ» ´ë»óÀ¸·Î ÇÑ Heartbeat ¹«°á¼º °Ë»çÁÖ±â... ¸»Àº ÁÁÁö¸¸ ½Ç»ó Heartbeat ¿À´ÂÁö µîÀÇ ¿©ºÎ°Ë»ç DWORD dwCheckPeriod = pINFO->m_dwCheckUserValuationPeriod; ms_VALUATION_INFO.m_dwCheckUserValuationPeriod = dwCheckPeriod < 1000 ? 1000 : dwCheckPeriod; // °¢ À¯Àúº° Heartbeat ÆÐŶ ¼ö½Å½Ã ¼öÇàµÇ´Â Æò°¡·ÎÁ÷¿¡ »ç¿ëµÇ´Â ÀÎÀÚ¼³Á¤ ms_VALUATION_INFO.m_dwValuationPeriod = pINFO->m_dwValuationPeriod; ms_VALUATION_INFO.m_dwHeartbeatTick = pINFO->m_dwHeartbeatTick; ms_VALUATION_INFO.m_bUseArmorKitHeartbeat = pINFO->m_bUseArmorKitHeartbeat; // return TRUE; } //sSTRICT_HEARTBEAT_UPPERBOUND_RECORD s_pRECORDs[50]; BOOL PROCESS_HEARTBEAT_VALUATION::DoInit() { m_dwStatus = this->FIRST; m_dwAssuranceTime[this->CHECK_FIXER] = 0; m_dwAssuranceTime[this->ADD_FIXER] = 0; DWORD& dwMaxRound = ms_RECORD_INFO.dwMaxRound; dwMaxRound = (DWORD)(ms_VALUATION_INFO.m_dwValuationPeriod / ms_VALUATION_INFO.m_dwHeartbeatTick); dwMaxRound += (DWORD)((ms_VALUATION_INFO.m_dwValuationPeriod % ms_VALUATION_INFO.m_dwHeartbeatTick) ? 1 : 0); ms_RECORD_INFO.dwMaxRound = dwMaxRound; ms_RECORD_INFO.pRECORD = new sSTRICT_HEARTBEAT_UPPERBOUND_RECORD[ dwMaxRound ]; memset( ms_RECORD_INFO.pRECORD, 0, sizeof(sSTRICT_HEARTBEAT_UPPERBOUND_RECORD)*dwMaxRound ); //ms_RECORD_INFO.pRECORD = s_pRECORDs; //memset( ms_RECORD_INFO.pRECORD, 0, sizeof(s_pRECORDs) ); sSTRICT_HEARTBEAT_UPPERBOUND_RECORD* pRECORD = ms_RECORD_INFO.pRECORD; //DWORD dwSumTick = ms_VALUATION_INFO.m_dwHeartbeatTick; for( DWORD i=0 ; im_dwFlagTick = dwSumTick; //pRECORD->m_dwTotalCounts = i+1; //dwSumTick += ms_VALUATION_INFO.m_dwHeartbeatTick; pRECORD->m_dwFlagTick = ms_VALUATION_INFO.m_dwHeartbeatTick; pRECORD->m_dwTotalCounts = i+1; } DWORD dwPeriod = ms_VALUATION_INFO.m_dwCheckUserValuationPeriod; DWORD dwStartTick = GetTickCount(); m_dwTimeout = dwStartTick + dwPeriod; return TRUE; } class CheckValuationHeartbeat { DWORD m_dwCurTick; DWORD m_dwValuationPeriod; public: CheckValuationHeartbeat( DWORD dwCurTick, DWORD dwValuationPeriod ) : m_dwCurTick(dwCurTick), m_dwValuationPeriod(dwValuationPeriod) {} ~CheckValuationHeartbeat(){} void operator() ( UserSession* pUser ) { User* pCheckUser = (User*)pUser; HeartbeatChecker& rChecker = pCheckUser->GetHeartbeatChecker(); DWORD& dwLifeTimeout = rChecker.LifeTimeOut(); if( m_dwCurTick < dwLifeTimeout ) return; DWORD& dwSignaledCount = rChecker.SignaledCount(); if( dwSignaledCount ) { // ÃÖ¼ÒÇÑ Çϳª¶óµµ Heartbeat ÆÐŶÀ» ¼ö½Å¹Þ¾Ò´Ù. // ¼ö½Å ¹ÞÀº ÆÐŶ ¼ö´Â ¿©±â¼­´Â Æò°¡´ë»óÀÌ ¾Æ´Ï´Ù. dwLifeTimeout += m_dwValuationPeriod; dwSignaledCount = 0; } else { // ´ÙÀ½ µÎ ÁÙÀº Àӽà ·çƾÀÌ´Ù. dwLifeTimeout += m_dwValuationPeriod; dwSignaledCount = 0; //Çѹøµµ ¼ö½Å¹ÞÁö ¾Ê´Â °æ¿ì´Ù. ÀÌ °æ¿ì¶ó¸é ²÷¾îµµ ¹«¹æ // ÀÌ ·çƾÀº Ŭ¶óÀÌ¾ðÆ® Á¤Áö »óŰ¡ ÇØ°áµÇ¸é Á¦°øÇϱâ·Î ÇÑ´Ù. pCheckUser->SetDisconnectCode( RC::RC_DISCONNECT_IRREGULAR_CLIENT_CYCLE_TICK ); pCheckUser->DisconnectUser( TRUE ); SECURELOG( SECURELOG_USERINFO(pCheckUser, eABUSE_LOGIC_VIOLATION, eABUSE_SUB_LOGIC_VIOLATION_HEARTBEAT_DISCONNECT), _T("[VALUATION ROUTINE] Disconnect by Heartbeat") ); return; } // ArmorKit Heartbeat°¡ ±¸ÇöµÇ¾úÀ» °æ¿ì¿¡´Â ¿©±â¿¡ ±¸ÇöÇϱâ·Î ÇÑ´Ù. } }; BOOL PROCESS_HEARTBEAT_VALUATION::DoProcess() { // CHANGES: f101229.2L, skip time statistics checker because LMP issues. return true; // #if SUN_CODE_BACKUP DWORD dwCurTick = GetTickCount(); if( m_dwTimeout > dwCurTick ) return TRUE; // °¡Àå ¸¶Áö¸·¿¡ ¾÷µ¥ÀÌÆ® Çϵµ·Ï ÇÏÀÚ. 󸮰úÁ¤¿¡¼­ ½Ã°£ÀÌ ¹Ù²î´Â °æ¿ì... -_-;;; // ÀÌ ·çƾÀº ±×·¸°Ô±îÁö ÇÒ ÇÊ¿ä ¾ø³ª? DWORD dwPeriod = ms_VALUATION_INFO.m_dwCheckUserValuationPeriod; m_dwTimeout = dwCurTick + dwPeriod; // óÀ½À» Á¦¿ÜÇÑ Áֱ⸶´Ù ¸ðµç Ç÷¹ÀÌÁßÀÎ À¯ÀúµéÀ» ´ë»óÀ¸·Î °Ë»çÇÏ´Â ·çƾÀÌ ¿ä±¸µÈ´Ù. // ÃøÁ¤ ½ÃÁ¡: // ÇØ´ç À¯ÀúÀÇ Å¬¶óÀÌ¾ðÆ®¿¡ ArmorKitÀÌ µ¿ÀÛÁßÀΰ¡? // ÇØ´ç À¯ÀúÀÇ Heartbeat´Â ¼ö½ÅµÇ°í Àִ°¡? // ±âŸ µîµî DWORD dwHeartbeatTick = PROCESS_HEARTBEAT_VALUATION::GetHeartbeatTick(); DWORD dwValuationPeriod = dwHeartbeatTick * (PROCESS_HEARTBEAT_VALUATION::GetRecordInfo()->dwMaxRound); CheckValuationHeartbeat checker(dwCurTick, dwValuationPeriod); UserManager::Instance()->Foreach( checker ); return TRUE; #endif //SUN_CODE_BACKUP } BOOL PROCESS_HEARTBEAT_VALUATION::IsComplete() { return (BOOL)(this->LAST == m_dwStatus); } BOOL PROCESS_HEARTBEAT_VALUATION::DoRelease() { SAFE_DELETE(ms_RECORD_INFO.pRECORD); return TRUE; } VOID PROCESS_HEARTBEAT_VALUATION::OnMsg( sSIG_MSG* pSIG_MSG ) { __UNUSED(pSIG_MSG); }