Files
Client/Server/ManageTool/MonitoringTool/ManagerServerEventHandler.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

249 lines
7.8 KiB
C++

#include "stdafx.h"
#include "MonitoringTool.h"
#include "ManagerServerEventHandler.h"
#include "MonitoringToolSetup.h"
#include "LoginDlg.h"
#include "GlobalFunc.h"
#include <Utility/Setup/ServerSetup.h>
#include <Network/Packet/ManagePacketCmd.h>
#include <Network/Dispatch/SendManagePacket.h>
#include <UserManage/UserStatistics.h>
#include <Log/ServerLog.h>
#include <Utility/Compress/MiniLZO/MiniLZOWrapper.h>
#include <mmsystem.h>
namespace ClientNet
{
CManagerServerEventHandler::CManagerServerEventHandler()
: m_dwLastPingRecvTime(0)
{
}
CManagerServerEventHandler::~CManagerServerEventHandler()
{
}
bool CManagerServerEventHandler::Connect()
{
CMonitoringToolSetup Setup = CMonitoringToolSetup::GetInstance();
const char* szIP = Setup.GetString(_T("MANAGER_SERVER_CONNECTION"), _T("MANAGER_SERVER_IP"));
CManagerServerEventHandler* lpHandler = new CManagerServerEventHandler;
if (!theApp.GetEventHandlerMgr().Connect(
INET_Addr(szIP, CServerSetup::ManageServerManageToolListen), lpHandler))
{
delete lpHandler;
return false;
}
return true;
}
int CManagerServerEventHandler::OnOpen(int iErrorCode)
{
if(0 == iErrorCode)
{
theApp.RegisterManagerHandler(this);
INET_Addr& addr = GetPeerAddress();
INFLOG3(g_Log, _T("Connect Session (ManagerServer): DP:0x%p, %s:%d"),
this, addr.get_addr_string(), addr.get_port_in());
theApp.ReportResult(GetMyINIString("LOCAL_STRING", "STRING_037"));
}
else
{
ERRLOG1(g_Log, _T("Connect Session Failed (ManagerServer): Err- %d"), iErrorCode);
theApp.ReportResult(GetMyINIString("LOCAL_STRING", "STRING_038"));
}
m_dwLastPingRecvTime = timeGetTime();
return 0;
}
int CManagerServerEventHandler::OnClose()
{
CWnd* lpWnd = AfxGetMainWnd();
if(0 != lpWnd && !IsCloseCalled())
{
lpWnd->PostMessage(WM_SHOW_MSGBOX, MSGBOX_MANAGER_DISCONNECTED);
}
INFLOG1(g_Log, _T("Disconnect Session (ManagerServer): DP:0x%p"), this);
theApp.ReportResult(GetMyINIString("LOCAL_STRING", "STRING_039"));
theApp.RemoveManagerHandler(this);
return 0;
}
int CManagerServerEventHandler::OnDispatch(PktBase* lpPktBase, INET_Addr& peerAddr)
{
switch(lpPktBase->GetCmd())
{
case ServerManage::CMD::AuthUser: RecvAuthAck(lpPktBase, peerAddr); break;
case ServerManage::CMD::RelayCommand: RecvUserStatistics(lpPktBase, peerAddr); break;
case ServerManage::CMD::Ping: RecvPing(lpPktBase, peerAddr); break;
}
return 0;
}
/// \brief 관리서버로 부터 동접정보를 받아서 저장
/// \return 패킷 처리 성공 여부
bool CManagerServerEventHandler::RecvUserStatistics(PktBase* lpPktBase, INET_Addr& peerAddr)
{
if(lpPktBase->GetLen() < sizeof(ServerManage::ManageCommand))
{
ERRLOG3(g_Log, _T("DP:0x%p/Cmd:0x%p/Invalid packet size : %d"),
this, lpPktBase->GetCmd(), lpPktBase->GetLen());
}
else if(0 != lpPktBase->GetError())
{
ERRLOG3(g_Log, _T("DP:0x%p/Cmd:0x%p/Err:%d/Get ProcessStatus packet failed"),
this, lpPktBase->GetCmd(), lpPktBase->GetError());
}
else
{
ServerManage::ManageCommand* lpManageCommand =
reinterpret_cast<ServerManage::ManageCommand*>(lpPktBase);
if(!ServerManage::CheckManagePacketLength(lpPktBase))
{
ERRLOG3(g_Log, _T("DP:0x%p/Cmd:0x%p/Invalid packet size : %d"),
this, lpPktBase->GetCmd(), lpPktBase->GetLen());
}
if(sizeof(ServerManage::PktManagePacket) <= lpManageCommand->usDataLen)
{
ServerManage::PktManagePacket* lpPktManagePacket =
reinterpret_cast<ServerManage::PktManagePacket*>(lpManageCommand + 1);
switch(lpPktManagePacket->m_dwSubCommand)
{
case ServerManage::CMD::SubCmd_ServerUserNum:
{
ServerManage::PktManageUserNum* lpPktManageUserNum =
static_cast<ServerManage::PktManageUserNum*>(lpPktManagePacket);
CUserStatistics::GetInstance().SerializeIn(lpManageCommand->dwRunID,
reinterpret_cast<ServerManage::UserNumPair*>(lpPktManageUserNum + 1),
lpPktManageUserNum->m_dwUserInfoNum);
}
break;
}
return true;
}
}
return false;
}
/// \brief 관리서버로 인증패킷 전송
/// \param lpHandler 관리서버 연결 세션
/// \param lpUserInfo 로그인 유저 정보
/// \param cUserInfoNum 유저수(모니터링툴에선 1로 고정)
/// \param cCommand 커맨드
/// \param cError 인증 패킷 전송에 따른 에러코드
/// \return 패킷 전송 처리 성공 여부
bool CManagerServerEventHandler::SendUserInfo(CManagerServerEventHandler* lpHandler,
const ServerManage::UserInfo* lpUserInfo,
unsigned char cUserInfoNum,
unsigned char cCommand,
unsigned char cError)
{
// 다른 유저들에게 자신이 추가되었다는 메시지를 던진다.
CNetworkMsgPool& networkMsgPool = CNetworkMsgPool::GetInstance();
CNetworkMsgBlock* lpBuffer = networkMsgPool.GetNetworkMsgBlock(
sizeof(ServerManage::UserCommand) + sizeof(ServerManage::UserInfo) * cUserInfoNum, INET_Addr());
CNetworkMsgBlock* lpCompressedBuffer = networkMsgPool.GetNetworkMsgBlock(
CMiniLZO::GetLeastCompressBuffer(sizeof(ServerManage::UserCommand) +
sizeof(ServerManage::UserInfo) * cUserInfoNum), INET_Addr());
if(0 != lpBuffer && 0 != lpCompressedBuffer)
{
ServerManage::UserCommand* lpUserCommand = reinterpret_cast<ServerManage::UserCommand*>(lpBuffer->wr_ptr());
ServerManage::UserInfo* lpFirstUserInfo = reinterpret_cast<ServerManage::UserInfo*>(lpUserCommand + 1);
ServerManage::UserInfo* lpLastUserInfo = lpFirstUserInfo + cUserInfoNum;
lpUserCommand->cUserInfoNum = cUserInfoNum;
std::copy(lpUserInfo, lpUserInfo + cUserInfoNum, lpFirstUserInfo);
lpBuffer->wr_ptr(sizeof(ServerManage::UserCommand) + sizeof(ServerManage::UserInfo) * cUserInfoNum);
if(lpCompressedBuffer->WrapCompress(lpBuffer->rd_ptr(), (unsigned short)lpBuffer->length(),
cCommand, 0, cError))
{
networkMsgPool.FreeNetworkMsgBlock(lpBuffer);
theApp.GetEventHandlerMgr().SendPacket(lpHandler, lpCompressedBuffer);
return true;
}
}
networkMsgPool.FreeNetworkMsgBlock(lpBuffer);
networkMsgPool.FreeNetworkMsgBlock(lpCompressedBuffer);
return false;
}
/// \brief 관리서버 인증 Ack
void CManagerServerEventHandler::RecvAuthAck(PktBase* lpPktBase, INET_Addr& peerAddr)
{
CString strErrFormat;
CLoginDlg* lpLoginDlg =
static_cast<CLoginDlg*>(theApp.GetRegisteredWindow(IDD_LOGINDLG));
if(lpPktBase->GetLen() < sizeof(ServerManage::UserCommand))
{
ERRLOG3(g_Log, _T("DP:0x%p/Cmd:0x%p/Invalid packet size : %d"),
this, lpPktBase->GetCmd(), lpPktBase->GetLen());
}
else if(0 != lpPktBase->GetError())
{
switch(lpPktBase->GetError())
{
case ServerManage::AUTHORIZE_FAILED:
strErrFormat = _T("ManagerServer Auth Failed: AUTHORIZE_FAILED");
break;
case ServerManage::CANNOT_AUTHORIZE_NOT_USER:
strErrFormat = _T("ManagerServer Auth Failed: CANNOT_AUTHORIZE_NOT_USER");
break;
case ServerManage::CANNOT_AUTHORIZE_INVALID_PASSWORD:
strErrFormat = _T("ManagerServer Auth Failed: CANNOT_AUTHORIZE_INVALID_PASSWORD");
break;
case ServerManage::CANNOT_AUTHORIZE_INVALID_IPADDRESS:
strErrFormat = _T("ManagerServer Auth Failed: CANNOT_AUTHORIZE_INVALID_IPADDRESS");
break;
case ServerManage::ALREADY_LOGINED:
strErrFormat = _T("ManagerServer Auth Failed: ALREADY_LOGINED");
break;
default:
break;
}
}
else
{
lpLoginDlg->OnOK();
strErrFormat = GetMyINIString("LOCAL_STRING", "STRING_040");
}
theApp.ReportResult(strErrFormat);
}
/// \brief 관리서버에서 마지막으로 핑받은 시각 갱신
void CManagerServerEventHandler::RecvPing(PktBase* lpPktBase, INET_Addr& peerAddr)
{
m_dwLastPingRecvTime = timeGetTime();
}
}