#include "stdafx.h" #include ".\GameAgentServerSession.h" #include #include #include #include ".\AuthAgentFrame.h" #include ".\GameAgentManager.h" #include ".\GameAgentInfoList.h" __IMPL_CUSTOMPOOL_PTR(GameAgentServerSession); GameAgentServerSession::GameAgentServerSession() : game_agent_id_(0) { } GameAgentServerSession::~GameAgentServerSession() { } // CHANGES: f101030.1L, moved from 'OnAccept' redirect logic void GameAgentServerSession::AuthenticateConnectedAgentServer(ulong ip_address, uint16_t listen_port) { const sGAME_AGENT_INFO* agent_info = \ GameAgentInfoList::Instance()->FindAgentInfoForPrivateIPAddress(ip_address, listen_port); const char* ip_address_string = GetIP(); if (agent_info == NULL) { SUNLOG(eCRITICAL_LOG, _T("["__FUNCTION__"]|IP[%s] 拒绝访问!|"), ip_address_string); Disconnect(true); return; }; // game_agent_id_ = agent_info->game_agent_id_; // if (!GameAgentManager::Instance()->AddAgent(game_agent_id_, this)) { SUNLOG(eCRITICAL_LOG, _T("["__FUNCTION__"]|游戏代理服务ID[%u]IP[%s] 重复连接!|"), game_agent_id_, ip_address_string); Disconnect(true); return; }; ;{ MSG_AS_AUTH_GAMEAGENT_LOGIN_CMD msg; msg.m_ConnectStatus = 1; msg.m_GameAgentID = game_agent_id_; AuthAgentFrame::Instance()->SendAuthServer(&msg, sizeof(msg)); }; SUNLOG(eCRITICAL_LOG, "[GameAgentServerSession::OnAccept] 游戏代理服务ID[%u]IP[%s] 已连接", game_agent_id_, ip_address_string); } void GameAgentServerSession::OnAccept(DWORD dwNetworkIndex) { ServerSession::OnAccept(dwNetworkIndex); assert(game_agent_id_ == 0); #if !defined(_NA000000_CONFIGURATION_TO_ACCEPT_MULTI_AGENT_ON_SAME_IP_ADDRESS) // CHANGES: f101030.1L AuthenticateConnectedAgentServer(GetIPAddress(), 0); #endif } void GameAgentServerSession::OnDisconnect() { if(game_agent_id_ != 0) { MSG_AS_AUTH_GAMEAGENT_LOGIN_CMD msg; msg.m_ConnectStatus = 0; msg.m_GameAgentID = game_agent_id_; AuthAgentFrame::Instance()->SendAuthServer(&msg, sizeof(msg)); GameAgentManager::Instance()->RemoveAgent(game_agent_id_); } else { // 俊矾 } SUNLOG(eCRITICAL_LOG, "[GameAgentServerSession::OnDisconnect] 游戏代理服务ID[%u]IP[%s]", game_agent_id_, GetIP()); ServerSession::OnDisconnect(); game_agent_id_ = 0; } void GameAgentServerSession::OnRecv(BYTE* pMsg, WORD wSize) { MSG_BASE_INTERNAL* pRecvMsg = (MSG_BASE_INTERNAL*)pMsg; SHOW_AUTH_INTER_PACKET_FLOW_TRACE(pRecvMsg, wSize); // _NA_002455_20110328_AUTH_HEART_BEAT if (pRecvMsg->m_byCategory == CATEGORY_AUTH && pRecvMsg->m_byProtocol == AU_AUTH_HEART_BEAT_SYN) { MSG_AU_AUTH_HEART_BEAT_ACK msg; SendPacket(&msg, msg.GetSize()); return; } switch(pRecvMsg->m_byProtocol) { #ifdef _NA000000_CONFIGURATION_TO_ACCEPT_MULTI_AGENT_ON_SAME_IP_ADDRESS // first sent protocol case AU_AUTH_CONNECTOR_CHANGE_CONFIG_SYN: OnAU_AUTH_CONNECTOR_CHANGE_CONFIG_SYN(pRecvMsg, wSize); break; #endif case GA_AUTH_NEWCLIENT_TO_GAMEAGENT_ACK:OnGA_AUTH_NEWCLIENT_TO_GAMEAGENT_ACK(pRecvMsg, wSize);break; case GA_AUTH_PC_LOGIN_CMD: OnGA_AUTH_PC_LOGIN_CMD(pRecvMsg, wSize); break; case GA_AUTH_PC_LOGOUT_CMD: OnGA_AUTH_PC_LOGOUT_CMD(pRecvMsg, wSize); break; case GA_AUTH_ASK_PC_LOGOUT_ACK: OnGA_AUTH_ASK_PC_LOGOUT_ACK(pRecvMsg, wSize); break; case GA_AUTH_BILLING_ALARM_ACK: OnGA_AUTH_BILLING_ALARM_ACK(pRecvMsg, wSize); break; case GA_AUTH_PC_NAME_NTF: OnGA_AUTH_PC_NAME_NTF(pRecvMsg, wSize); break; case GA_AUTH_USER_COUNT_NTF: OnGA_AUTH_USER_COUNT_NTF(pRecvMsg, wSize); break; #ifdef __NA001334_090420_SERVER_SELECT_FACILITY__ case AU_AUTH_SERVER_SELECT_SYN: OnAU_AUTH_SERVER_SELECT_SYN(pRecvMsg, wSize); break; #endif #ifdef __NA000000_SHOP_USERID_50_PASSING_PROC__ case AU_AUTH_COMMON_QUERY_USER_ID_SYN: OnAU_AUTH_COMMON_QUERY_USER_ID_SYN(pRecvMsg, wSize); break; #endif default: { SUNLOG(eCRITICAL_LOG, "[GameAgentServerSession] 数据包无效! " "IP[%s] Category[%u] Protocol[%u] Size[%u]", GetIP(), pRecvMsg->m_byCategory, pRecvMsg->m_byProtocol, wSize); } break; } } #ifdef _NA000000_CONFIGURATION_TO_ACCEPT_MULTI_AGENT_ON_SAME_IP_ADDRESS // NOTE: f101030.1L, change the specification to accept multi-agent on same ip address // first sent protocol void GameAgentServerSession::OnAU_AUTH_CONNECTOR_CHANGE_CONFIG_SYN(MSG_BASE_INTERNAL* pMsg, WORD size) { const MSG_AU_AUTH_CONNECTOR_CHANGE_CONFIG_SYN* recv_msg = \ static_cast(pMsg); // const uint16_t listen_port = recv_msg->listen_port_; // if (game_agent_id_ != 0) { SUNLOG(eCRITICAL_LOG, _T("|["__FUNCTION__"]|") _T("信息=已进行身份验证|Ip='%s', 端口=%u|"), GetIP(), listen_port); Disconnect(); return; } const ulong ip_address = GetIPAddress(); AuthenticateConnectedAgentServer(ip_address, listen_port); } #endif void GameAgentServerSession::OnGA_AUTH_NEWCLIENT_TO_GAMEAGENT_ACK(MSG_BASE_INTERNAL* pMsg, WORD size) { MSG_GA_AUTH_NEWCLIENT_TO_GAMEAGENT_ACK* pRecvMsg = (MSG_GA_AUTH_NEWCLIENT_TO_GAMEAGENT_ACK*)pMsg; static_cast(reinterpret_cast(1)); MSG_AS_AUTH_NEWCLIENT_TO_GAMEAGENT_ACK msg; static_cast(msg) = *pRecvMsg; //memcpy(&msg, pRecvMsg, sizeof(MSG_GA_AUTH_NEWCLIENT_TO_GAMEAGENT_ACK)); msg.m_byProtocol = AS_AUTH_NEWCLIENT_TO_GAMEAGENT_ACK; msg.m_GameAgentID = game_agent_id_; AuthAgentFrame::Instance()->SendAuthServer(&msg, sizeof(msg)); SUNLOG(eFULL_LOG, "[OnGA_AUTH_NEWCLIENT_TO_GAMEAGENT_ACK] 成功!"); } void GameAgentServerSession::OnGA_AUTH_PC_LOGIN_CMD(MSG_BASE_INTERNAL* pMsg, WORD size) { MSG_GA_AUTH_PC_LOGIN_CMD* pRecvMsg = (MSG_GA_AUTH_PC_LOGIN_CMD*)pMsg; static_cast(reinterpret_cast(1)); MSG_AS_AUTH_PC_LOGIN_CMD msg; static_cast(msg) = *pRecvMsg; //memcpy(&msg, pRecvMsg, sizeof(MSG_GA_AUTH_PC_LOGIN_CMD)); msg.m_byProtocol = AS_AUTH_PC_LOGIN_CMD; msg.m_GameAgentID = game_agent_id_; AuthAgentFrame::Instance()->SendAuthServer(&msg, sizeof(msg)); } void GameAgentServerSession::OnGA_AUTH_PC_LOGOUT_CMD(MSG_BASE_INTERNAL* pMsg, WORD size) { MSG_GA_AUTH_PC_LOGOUT_CMD* pRecvMsg = (MSG_GA_AUTH_PC_LOGOUT_CMD*)pMsg; static_cast(reinterpret_cast(1)); MSG_AS_AUTH_PC_LOGOUT_CMD msg; static_cast(msg) = *pRecvMsg; //memcpy(&msg, pRecvMsg, sizeof(MSG_GA_AUTH_PC_LOGOUT_CMD)); msg.m_byProtocol = AS_AUTH_PC_LOGOUT_CMD; msg.m_GameAgentID = game_agent_id_; msg.m_byLogoutType = pRecvMsg->m_byLogoutType; //增加登出类型用于判断是否封号 by:十里坡剑神 2021-06-28 AuthAgentFrame::Instance()->SendAuthServer(&msg, sizeof(msg)); } void GameAgentServerSession::OnGA_AUTH_ASK_PC_LOGOUT_ACK(MSG_BASE_INTERNAL* pMsg, WORD size) { MSG_GA_AUTH_ASK_PC_LOGOUT_ACK* pRecvMsg = (MSG_GA_AUTH_ASK_PC_LOGOUT_ACK*)pMsg; static_cast(reinterpret_cast(1)); MSG_AS_AUTH_ASK_PC_LOGOUT_ACK msg; static_cast(msg) = *pRecvMsg; //memcpy(&msg, pRecvMsg, sizeof(MSG_GA_AUTH_ASK_PC_LOGOUT_ACK)); msg.m_byProtocol = AS_AUTH_ASK_PC_LOGOUT_ACK; msg.m_GameAgentID = game_agent_id_; AuthAgentFrame::Instance()->SendAuthServer(&msg, sizeof(msg)); } // 呼傅 父丰 舅覆 菩哦 搬苞 void GameAgentServerSession::OnGA_AUTH_BILLING_ALARM_ACK(MSG_BASE_INTERNAL* pMsg, WORD size) { MSG_GA_AUTH_BILLING_ALARM_ACK* pRecvMsg = (MSG_GA_AUTH_BILLING_ALARM_ACK*)pMsg; // 肺弊父 巢变促. SUNLOG(eCRITICAL_LOG, "[OnGA_AUTH_BILLING_ALARM_ACK] 游戏代理服务ID[%u] 验证账号ID[%u] 结果[%u]", game_agent_id_, pRecvMsg->m_dwAuthUserID, pRecvMsg->m_byResult); } void GameAgentServerSession::OnGA_AUTH_PC_NAME_NTF(MSG_BASE_INTERNAL* pMsg, WORD size) { MSG_GA_AUTH_PC_NAME_NTF* pRecvMsg = (MSG_GA_AUTH_PC_NAME_NTF*)pMsg; static_cast(reinterpret_cast(1)); MSG_AS_AUTH_PC_NAME_NTF msg; static_cast(msg) = *pRecvMsg; //memcpy(&msg, pRecvMsg, sizeof(MSG_GA_AUTH_PC_NAME_NTF)); msg.m_byProtocol = AS_AUTH_PC_NAME_NTF; msg.m_GameAgentID = game_agent_id_; AuthAgentFrame::Instance()->SendAuthServer(&msg, sizeof(msg)); } void GameAgentServerSession::OnGA_AUTH_USER_COUNT_NTF(MSG_BASE_INTERNAL* pMsg, WORD size) { MSG_GA_AUTH_USER_COUNT_NTF* pRecvMsg = (MSG_GA_AUTH_USER_COUNT_NTF*)pMsg; static_cast(reinterpret_cast(1)); MSG_AS_AUTH_USER_COUNT_NTF msg; static_cast(msg) = *pRecvMsg; //memcpy(&msg, pRecvMsg, sizeof(MSG_GA_AUTH_USER_COUNT_NTF)); msg.m_byProtocol = AS_AUTH_USER_COUNT_NTF; msg.m_GameAgentID = game_agent_id_; AuthAgentFrame::Instance()->SendAuthServer(&msg, sizeof(msg)); } #ifdef __NA001334_090420_SERVER_SELECT_FACILITY__ void GameAgentServerSession::OnAU_AUTH_SERVER_SELECT_SYN(MSG_BASE_INTERNAL* pMsg, WORD size) { const MSG_AU_AUTH_SERVER_SELECT_SYN* pRecvMsg = static_cast(pMsg); MSG_AU_AUTH_SERVER_SELECT_SYN msg = *pRecvMsg; msg.m_GameAgentID = game_agent_id_; AuthAgentFrame::Instance()->SendAuthServer(&msg, sizeof(msg)); } #endif #ifdef __NA000000_SHOP_USERID_50_PASSING_PROC__ void GameAgentServerSession::OnAU_AUTH_COMMON_QUERY_USER_ID_SYN(MSG_BASE_INTERNAL* pMsg, WORD size) { const MSG_AU_AUTH_COMMON_QUERY_USER_ID_SYN* pRecvMsg = static_cast(pMsg); MSG_AU_AUTH_COMMON_QUERY_USER_ID_SYN msg = *pRecvMsg; msg.game_agent_id_ = game_agent_id_; AuthAgentFrame::Instance()->SendAuthServer(&msg, sizeof(msg)); } #endif