#include "StdAfx.h" #include ".\agentserversession.h" #include "PacketHandler.h" #include "ServerSessionManager.h" #ifdef _NA_006543_20130318_HEARTBEAT #include "PacketStruct_SA.h" #include "AgentServerSession.h" #include "WorldManager.h" #include "UnitServer.h" #include "Channel.h" #define HEARTBEAT_CYCLE 10000 #define HEARTBEAT_TIMEOUT 3000 #endif AgentServerSession::AgentServerSession(void) #ifdef _NA_006543_20130318_HEARTBEAT : m_byServerStatus(0) , m_isRecvHeartbeat(true) , m_sendTick(1) , m_recvTick(1) #endif { //m_dwAgentKey = 0; } AgentServerSession::~AgentServerSession(void) { } VOID AgentServerSession::OnRecv( BYTE *pMsg, WORD wSize ) { if( !pMsg ) return; PacketHandler::Instance()->ParserPacket_SA( this, (MSG_BASE*)pMsg, wSize ); } VOID AgentServerSession::OnConnect( BOOL bSuccess, DWORD dwNetworkIndex ) { ServerSession::OnConnect( bSuccess, dwNetworkIndex ); if( bSuccess ) { DISPMSG( "AgentServer Connected\n" ); } } VOID AgentServerSession::OnAccept( DWORD dwNetworkIndex ) { ServerSession::OnAccept( dwNetworkIndex ); DISPMSG( "AgentServer Connectd\n" ); } VOID AgentServerSession::OnDisconnect() { ServerSession::OnDisconnect(); DISPMSG( "AgentServer Disconnect\n" ); } #ifdef _NA_006543_20130318_HEARTBEAT VOID AgentServerSession::SendHeartBeat() { MSG_SA_CHECK_HEARTBEAT msg; m_isRecvHeartbeat=false; SendPacket((BYTE*)&msg, sizeof(msg)); //DISPMSG("Send HeartBeat to agentkey = %d\n", GetServerKey()); } VOID AgentServerSession::update() { DWORD curTick = GetTickCount(); _update_Send_Heartbeat(curTick); _update_Recv_Heartbeat(curTick); } VOID AgentServerSession::_update_Send_Heartbeat( DWORD curTick ) { //Heartbeat ¼Û½Å if(m_sendTick == 1) m_sendTick = GetTickCount(); if( curTick -m_sendTick > HEARTBEAT_CYCLE ) { SendHeartBeat(); m_sendTick = curTick; } } VOID AgentServerSession::_update_Recv_Heartbeat( DWORD curTick ) { // ÁöÁ¤µÈ ½Ã°£ ³»¿¡ ÀÀ´äÀÌ ¿À´ÂÁö üũ if(m_recvTick == 1) m_recvTick = GetTickCount(); if(m_isRecvHeartbeat == true) { m_recvTick = curTick; return; } //ÀÌ¹Ì ¿¬°áÀÌ ²÷±ä »óÅ if(GetServerStatus() == SERVER_STATUS_OFFLINE) return; if(curTick - m_recvTick > HEARTBEAT_TIMEOUT) { //¼­¹öÀÇ »óŸ¦ ¹Ù²Û´Ù UnitServer* pUnitserver = WorldManager::Instance()->FindFirstUnitServerByAgentKey(GetServerKey()); if(pUnitserver == NULL) { DISPMSG("[AgentServerSession::_update_Recv_Heartbeat()]ÇØ´ç agent°¡ ¼­¹ö¸¦ °¡Áö°íÀÖÁö¾ÊÀ½\n"); return ; } BYTE worldkey = pUnitserver->GetServerInfo().GetServerInfoEx().m_byWorld; BYTE channelkey = 0; Channel* pChannel=NULL; //¿ùµå ³»ÀÇ Ã¤³ÎµéÀ»(0¹øºÎÅÍ) µ¹¸é¼­ ÇØ´ç agentkey¸¦ °¡Áø ¼­¹ö°¡ ÀÖ´ÂÁö È®ÀÎÇϰí, ÀÖÀ¸¸é status¸¦ ¹Ù²Û´Ù. while(pChannel = WorldManager::Instance()->FindChannel(worldkey, channelkey)) { UnitServer* unitserver = pChannel->FindFirstUnitServerByAgentKey(GetServerKey()); if(unitserver != NULL && unitserver->GetServerStatus() != SERVER_STATUS_UNKNOWN) { pChannel->SetServerStatus(SERVER_STATUS_UNKNOWN); } channelkey++; } //AgentServerSessionÀÇ Statusµµ ¹Ù²Û´Ù SetServerStatus(SERVER_STATUS_OFFLINE); } } VOID AgentServerSession::CheckHeatbeatRecv() { m_isRecvHeartbeat = true; SetServerStatus(SERVER_STATUS_ONLINE); } #endif