Files
Client/Server/AdminTool/AdminToolServer/RYL_AgentServerTable.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

548 lines
16 KiB
C++

#include "stdafx.h"
#include "RYL_AgentServerTable.h"
#include "RYL_AgentServerDispatch.h"
#include <DBComponent/RYL_GameDB.h>
#include <DBComponent/BillingDB.h>
#include <DBComponent/AuthDB.h>
#include <Network/IOCP/IOCPNet.h>
#include <Network/Session/Session.h>
#include <Network/Session/CreatePolicy.h>
#include <Parser/ServerInfo.h>
#include <Log/ServerLog.h>
CAgentServerTable::CAgentServerTable()
{
Destroy(); // 초기화 대용
m_lpSessionPolicy = SessionPolicy::CreateTCPPolicy<CRylAgentServerDispatch>();
const char* szNation = CServerInfo::GetInstance().GetValue("NATION");
if (NULL != szNation)
{
strncpy(m_szNation , szNation, MAX_BUFFER);
}
else
{
ERRLOG0(g_Log, "운영 서버의 국가 타입 정보를 읽는데 실패했습니다.(셋업파일의 NATION값을 확인하십시요)");
exit(1);
}
}
CAgentServerTable::~CAgentServerTable()
{
Destroy();
}
void CAgentServerTable::Destroy()
{
// AgentServer Dispatch 를 전부 NULL로 채워버린다
m_IPtoServerID.clear();
// GameDB 객체 전부 소멸
CGameDB** DBfirst = m_lpGameDB;
CGameDB** DBlast = m_lpGameDB + MAX_AGENT_SERVER;
for(; DBfirst != DBlast; ++DBfirst)
{
CGameDB* lpGameDB = *DBfirst;
if(lpGameDB != NULL)
{
delete lpGameDB;
}
}
std::fill_n(m_lpGameDB, int(MAX_AGENT_SERVER), reinterpret_cast<CGameDB*>(NULL));
if (NULL != m_lpBillingDB)
{
delete m_lpBillingDB;
m_lpBillingDB = NULL;
}
if (NULL != m_lpBillingLogDB)
{
delete m_lpBillingLogDB;
m_lpBillingLogDB = NULL;
}
if (NULL != m_lpAuthDB)
{
delete m_lpAuthDB;
m_lpAuthDB = NULL;
}
if(NULL != m_lpSessionPolicy)
{
delete m_lpSessionPolicy;
m_lpSessionPolicy = NULL;
}
}
void CAgentServerTable::InitAgentServerTable(CIOCPNet& IOCPNetwork)
{
ConnectToAllAgentServerz(IOCPNetwork);
ConnectToBillingDB();
ConnectToAuthDB();
if (0 == strcmp(m_szNation, "KOREA"))
{
ConnectToBillingLogDB();
}
}
CGameDB* CAgentServerTable::GetGameDB(unsigned long dwServerID)
{
if (dwServerID < MAX_AGENT_SERVER)
{
if (m_lpGameDB[dwServerID] != NULL)
{
return m_lpGameDB[dwServerID];
}
}
return NULL;
}
CSession* CAgentServerTable::GetSession(unsigned long dwServerID)
{
GET_MULTI_DISPATCH(lpAgentDispatch, dwServerID,
CRylAgentServerDispatch, CRylAgentServerDispatch::GetDispatchTable());
if(NULL != lpAgentDispatch)
{
return &lpAgentDispatch->GetSession();
}
return NULL;
}
CServerRequestKeeper& CAgentServerTable::GetRequestKeeper(unsigned long dwServerGroup)
{
GET_MULTI_DISPATCH(lpAgentDispatch, dwServerGroup,
CRylAgentServerDispatch, CRylAgentServerDispatch::GetDispatchTable());
return lpAgentDispatch->GetRequestKeeper();
}
CRylAgentServerDispatch* CAgentServerTable::GetDispatch(unsigned long dwServerID)
{
GET_MULTI_DISPATCH(lpAgentDispatch, dwServerID,
CRylAgentServerDispatch, CRylAgentServerDispatch::GetDispatchTable());
return lpAgentDispatch;
}
void CAgentServerTable::RemoveAllModifyCharacter(CPacketDispatch* lpPacketDispatch)
{
for(int cnt = 0; cnt < MAX_AGENT_SERVER; cnt++)
{
GET_MULTI_DISPATCH(lpAgentDispatch,
cnt, CRylAgentServerDispatch, CRylAgentServerDispatch::GetDispatchTable());
if(NULL != lpAgentDispatch)
{
lpAgentDispatch->GetModifyCharacterMgr().AllRemoveChar(lpPacketDispatch);
}
}
}
void CAgentServerTable::RemoveAllDepositLock(CPacketDispatch* lpPacketDispatch)
{
for(int cnt = 0; cnt < MAX_AGENT_SERVER; cnt++)
{
GET_MULTI_DISPATCH(lpAgentDispatch,
cnt, CRylAgentServerDispatch, CRylAgentServerDispatch::GetDispatchTable());
if(NULL != lpAgentDispatch)
{
lpAgentDispatch->GetDepositLock().RemoveAllSelectDispatch(lpPacketDispatch);
}
}
}
void CAgentServerTable::ConnectToAgentServer(CIOCPNet& IOCPNetwork, unsigned long dwServerGroup)
{
DBAgentServerInfo stServerInfo;
if (GetAgentServerInfo(dwServerGroup, stServerInfo))
{
m_IPtoServerID[inet_addr(stServerInfo.szServerAddress)] = dwServerGroup;
GET_MULTI_DISPATCH(lpAgentDispatch, dwServerGroup,
CRylAgentServerDispatch, CRylAgentServerDispatch::GetDispatchTable());
if ((NULL == lpAgentDispatch) || (!lpAgentDispatch->GetSession().IsConnected()))
{
if(!IOCPNetwork.Connect(m_lpSessionPolicy,
stServerInfo.szServerAddress, CServerSetup::DBAgentAdminToolServerListen))
{
ERRLOG2(g_Log, "서버 연결 실패. IP: %s/Port: %d",
stServerInfo.szServerAddress, CServerSetup::DBAgentAdminToolServerListen);
}
}
CGameDB* lpDBComponent = new CGameDB;
if (lpDBComponent->Connect(stServerInfo.szDBServer, stServerInfo.szDBName,
stServerInfo.szDBAccount, stServerInfo.szDBPass))
{
m_lpGameDB[dwServerGroup] = lpDBComponent;
}
else
{
delete lpDBComponent;
ERRLOG4(g_Log, "DB 연결 실패. IP: %s/DBName: %s/DBAccount: %s/DBPass: %s",
stServerInfo.szDBServer, stServerInfo.szDBName,
stServerInfo.szDBAccount, stServerInfo.szDBPass);
}
}
}
void CAgentServerTable::ConnectToBillingDB()
{
char szErrMessage[1024];
CServerInfo& ServerInfoTXT = CServerInfo::GetInstance();
if(!ServerInfoTXT.Reload())
{
_snprintf(szErrMessage, sizeof(szErrMessage),
"Failed To Load Server Script : Filename- %s", ServerInfoTXT.GetFileName());
MessageBox(NULL, szErrMessage, "Err", MB_OK);
return;
}
char szBillingDBServerBuffer[MAX_BUFFER];
char szBillingDBNameBuffer[MAX_BUFFER];
char szBillingDBAccountBuffer[MAX_BUFFER];
char szBillingDBPassBuffer[MAX_BUFFER];
const char* szBillingServer = ServerInfoTXT.GetValue("BILLING_DB_IP");
const char* szBillingName = ServerInfoTXT.GetValue("BILLING_DB_NAME");
const char* szBillingAccount = ServerInfoTXT.GetValue("BILLING_DB_ACCOUNT");
const char* szBillingPass = ServerInfoTXT.GetValue("BILLING_DB_PASS");
strncpy(szBillingDBServerBuffer, szBillingServer, MAX_BUFFER);
strncpy(szBillingDBNameBuffer, szBillingName, MAX_BUFFER);
strncpy(szBillingDBAccountBuffer, szBillingAccount, MAX_BUFFER);
strncpy(szBillingDBPassBuffer, szBillingPass, MAX_BUFFER);
szBillingDBServerBuffer[MAX_BUFFER - 1] = 0;
szBillingDBNameBuffer[MAX_BUFFER - 1] = 0;
szBillingDBAccountBuffer[MAX_BUFFER - 1] = 0;
szBillingDBPassBuffer[MAX_BUFFER - 1] = 0;
CBillingDB* lpBillingDB = new CBillingDB;
if(lpBillingDB->ConnectSQLServer(szBillingDBServerBuffer, szBillingDBNameBuffer,
szBillingDBAccountBuffer, szBillingDBPassBuffer, OleDB::ConnType_MSSQL))
{
m_lpBillingDB = lpBillingDB;
}
else
{
ERRLOG4(g_Log, "과금 디비 연결 실패. IP: %s/DBName: %s/DBAccount: %s/DBPass: %s",
szBillingDBServerBuffer, szBillingDBNameBuffer,
szBillingDBAccountBuffer, szBillingDBPassBuffer);
m_lpBillingDB = NULL;
delete lpBillingDB;
}
}
void CAgentServerTable::ConnectToBillingLogDB()
{
char szErrMessage[1024];
CServerInfo& ServerInfoTXT = CServerInfo::GetInstance();
if(!ServerInfoTXT.Reload())
{
_snprintf(szErrMessage, sizeof(szErrMessage),
"Failed To Load Server Script : Filename- %s", ServerInfoTXT.GetFileName());
MessageBox(NULL, szErrMessage, "Err", MB_OK);
return;
}
char szBillingDBServerBuffer[MAX_BUFFER];
char szBillingDBNameBuffer[MAX_BUFFER];
char szBillingDBAccountBuffer[MAX_BUFFER];
char szBillingDBPassBuffer[MAX_BUFFER];
const char* szBillingServer = ServerInfoTXT.GetValue("BILLING_LOG_DB_IP");
const char* szBillingName = ServerInfoTXT.GetValue("BILLING_LOG_DB_NAME");
const char* szBillingAccount = ServerInfoTXT.GetValue("BILLING_LOG_DB_ACCOUNT");
const char* szBillingPass = ServerInfoTXT.GetValue("BILLING_LOG_DB_PASS");
strncpy(szBillingDBServerBuffer, szBillingServer, MAX_BUFFER);
strncpy(szBillingDBNameBuffer, szBillingName, MAX_BUFFER);
strncpy(szBillingDBAccountBuffer, szBillingAccount, MAX_BUFFER);
strncpy(szBillingDBPassBuffer, szBillingPass, MAX_BUFFER);
szBillingDBServerBuffer[MAX_BUFFER - 1] = 0;
szBillingDBNameBuffer[MAX_BUFFER - 1] = 0;
szBillingDBAccountBuffer[MAX_BUFFER - 1] = 0;
szBillingDBPassBuffer[MAX_BUFFER - 1] = 0;
CBillingDB* lpBillingDB = new CBillingDB;
if(lpBillingDB->ConnectSQLServer(szBillingDBServerBuffer, szBillingDBNameBuffer,
szBillingDBAccountBuffer, szBillingDBPassBuffer, OleDB::ConnType_MSSQL))
{
m_lpBillingLogDB = lpBillingDB;
}
else
{
ERRLOG4(g_Log, "과금 로그 디비 연결 실패. IP: %s/DBName: %s/DBAccount: %s/DBPass: %s",
szBillingDBServerBuffer, szBillingDBNameBuffer,
szBillingDBAccountBuffer, szBillingDBPassBuffer);
m_lpBillingLogDB = NULL;
delete lpBillingDB;
}
}
void CAgentServerTable::ConnectToAuthDB()
{
char szErrMessage[1024];
CServerInfo& ServerInfoTXT = CServerInfo::GetInstance();
if(!ServerInfoTXT.Reload())
{
_snprintf(szErrMessage, sizeof(szErrMessage),
"Failed To Load Server Script : Filename- %s", ServerInfoTXT.GetFileName());
MessageBox(NULL, szErrMessage, "Err", MB_OK);
return;
}
char szAuthDBServerBuffer[MAX_BUFFER];
char szAuthDBNameBuffer[MAX_BUFFER];
char szAuthDBAccountBuffer[MAX_BUFFER];
char szAuthDBPassBuffer[MAX_BUFFER];
const char* szAuthDBAddr = ServerInfoTXT.GetValue("AUTH_DB_IP");
const char* szAuthDBName = ServerInfoTXT.GetValue("AUTH_DB_NAME");
const char* szAuthDBAccount = ServerInfoTXT.GetValue("AUTH_DB_ACCOUNT");
const char* szAuthDBPass = ServerInfoTXT.GetValue("AUTH_DB_PASS");
strncpy(szAuthDBServerBuffer, szAuthDBAddr, MAX_BUFFER);
strncpy(szAuthDBNameBuffer, szAuthDBName, MAX_BUFFER);
strncpy(szAuthDBAccountBuffer, szAuthDBAccount, MAX_BUFFER);
strncpy(szAuthDBPassBuffer, szAuthDBPass, MAX_BUFFER);
szAuthDBServerBuffer[MAX_BUFFER - 1] = 0;
szAuthDBNameBuffer[MAX_BUFFER - 1] = 0;
szAuthDBAccountBuffer[MAX_BUFFER - 1] = 0;
szAuthDBPassBuffer[MAX_BUFFER - 1] = 0;
CAuthDB* lpAuthDB = new CAuthDB;
if (true == lpAuthDB->ConnectSQLServer(szAuthDBServerBuffer,
szAuthDBNameBuffer, szAuthDBAccountBuffer, szAuthDBPassBuffer, OleDB::ConnType_MSSQL))
{
m_lpAuthDB = lpAuthDB;
}
else
{
ERRLOG4(g_Log, "인증 디비 연결 실패. IP: %s/DBName: %s/DBAccount: %s/DBPass: %s",
szAuthDBServerBuffer, szAuthDBNameBuffer,
szAuthDBAccountBuffer, szAuthDBPassBuffer);
m_lpAuthDB = NULL;
delete lpAuthDB;
}
}
void CAgentServerTable::ConnectToAllAgentServerz(CIOCPNet& IOCPNetwork)
{
for(unsigned long dwServerGroup = 0; dwServerGroup < MAX_AGENT_SERVER; ++dwServerGroup)
{
ConnectToAgentServer(IOCPNetwork, dwServerGroup);
}
}
void CAgentServerTable::PrintServerState(char* szText, int length)
{
const int MAX_BUFFER = 256;
int nLength = 0;
char szServerNameBuffer[MAX_BUFFER]; // 그룹 명
char szServerAddressBuffer[MAX_BUFFER]; // 중계서버 IP
char szDBNameBuffer[MAX_BUFFER]; // 디비 명
CServerInfo& ServerInfoTXT = CServerInfo::GetInstance();
nLength += _snprintf(szText + nLength, length - nLength, ">> NationType: %s\r\n", m_szNation);
nLength += _snprintf(szText + nLength, length - nLength, ">> DBAgentServer Connection State: \r\n");
for (unsigned long dwServerGroup = 0; dwServerGroup < MAX_AGENT_SERVER; ++dwServerGroup)
{
_snprintf(szServerNameBuffer, MAX_BUFFER, "SERVERGROUP_NAME_%02u", dwServerGroup);
_snprintf(szServerAddressBuffer, MAX_BUFFER, "AGENTSERVER_IP_%02u", dwServerGroup);
_snprintf(szDBNameBuffer, MAX_BUFFER, "GAME_DB_NAME_%02u", dwServerGroup);
const char* szServerName = ServerInfoTXT.GetValue(szServerNameBuffer);
const char* szServerAddress = ServerInfoTXT.GetValue(szServerAddressBuffer);
const char* szDBName = ServerInfoTXT.GetValue(szDBNameBuffer);
if((szServerName != NULL) && (szServerAddress != NULL) && (szDBName))
{
strncpy(szServerNameBuffer, szServerName, MAX_BUFFER);
strncpy(szServerAddressBuffer, szServerAddress,MAX_BUFFER);
strncpy(szDBNameBuffer, szDBName, MAX_BUFFER);
szServerNameBuffer[MAX_BUFFER - 1] = 0;
szServerAddressBuffer[MAX_BUFFER - 1] = 0;
szDBNameBuffer[MAX_BUFFER - 1] = 0;
GET_MULTI_DISPATCH(lpAgentDispatch, dwServerGroup,
CRylAgentServerDispatch, CRylAgentServerDispatch::GetDispatchTable());
CGameDB* lpGameDB = m_lpGameDB[dwServerGroup];
nLength += _snprintf(szText + nLength, length - nLength,
"[%02u] %15s : ", dwServerGroup, szServerNameBuffer);
if(NULL != lpAgentDispatch)
{
nLength += _snprintf(szText + nLength, length - nLength, "DBAgent Connected");
}
else
{
nLength += _snprintf(szText + nLength, length - nLength, "DBAgent Disconnected");
}
if(NULL != lpGameDB)
{
nLength += _snprintf(szText + nLength, length - nLength, " (DB Connected)\r\n");
}
else
{
nLength += _snprintf(szText + nLength, length - nLength, " (DB Disconnected)\r\n");
}
}
}
// 한국, 해외일 경우 각각 연결해야 하는 기타 DB 종류가 다름.
nLength += _snprintf(szText + nLength, length - nLength, "\r\n>> ETC Connection State: \r\n");
nLength += _snprintf(szText + nLength, length - nLength, "BillingDB Connection State:\t");
if(NULL != m_lpBillingDB)
nLength += _snprintf(szText + nLength, length - nLength, "Connected\r\n");
else
nLength += _snprintf(szText + nLength, length - nLength, "Disconnected\r\n");
if (0 == strcmp(m_szNation, "KOREA"))
{
nLength += _snprintf(szText + nLength, length - nLength, "BillingLogDB Connection State:\t");
if(NULL != m_lpBillingLogDB)
nLength += _snprintf(szText + nLength, length - nLength, "Connected");
else
nLength += _snprintf(szText + nLength, length - nLength, "Disconnected");
}
else
{
nLength += _snprintf(szText + nLength, length - nLength, "AuthDB Connection State:\t");
if(NULL != m_lpAuthDB)
nLength += _snprintf(szText + nLength, length - nLength, "Connected\r\n");
else
nLength += _snprintf(szText + nLength, length - nLength, "Disconnected\r\n");
}
}
void CAgentServerTable::Disconnected(unsigned long dwIP)
{
m_IPtoServerID.erase(dwIP);
}
unsigned long CAgentServerTable::GetGroupFromDBAgentIP(unsigned long dwIP)
{
IPtoServerID::iterator pos = m_IPtoServerID.find(dwIP);
if(pos != m_IPtoServerID.end())
{
return pos->second;
}
return MAX_AGENT_SERVER;
}
bool CAgentServerTable::GetAgentServerInfo(unsigned long dwGroupIndex,
DBAgentServerInfo& stAgentServerInfo)
{
char szErrMessage[1024];
CServerInfo& ServerInfoTXT = CServerInfo::GetInstance();
if(!ServerInfoTXT.Reload())
{
_snprintf(szErrMessage, sizeof(szErrMessage),
"Failed To Load Server Script : Filename- %s", ServerInfoTXT.GetFileName());
MessageBox(NULL, szErrMessage, "Err", MB_OK);
return false;
}
char szServerNameKey[MAX_BUFFER]; // 해당 그룹명
char szServerAddressKey[MAX_BUFFER]; // 중계 서버 IP
char szDBServerKey[MAX_BUFFER]; // 게임 디비 IP
char szDBNameKey[MAX_BUFFER]; // 게임 디비 명
char szDBAccountKey[MAX_BUFFER]; // 게임 디비 계정
char szDBPassKey[MAX_BUFFER]; // 게임 디비 패스워드
_snprintf(szServerNameKey, MAX_BUFFER, "SERVERGROUP_NAME_%02u", dwGroupIndex);
_snprintf(szServerAddressKey, MAX_BUFFER, "AGENTSERVER_IP_%02u", dwGroupIndex);
_snprintf(szDBServerKey, MAX_BUFFER, "GAME_DB_IP_%02u", dwGroupIndex);
_snprintf(szDBNameKey, MAX_BUFFER, "GAME_DB_NAME_%02u", dwGroupIndex);
_snprintf(szDBAccountKey, MAX_BUFFER, "GAME_DB_ACCOUNT_%02u", dwGroupIndex);
_snprintf(szDBPassKey, MAX_BUFFER, "GAME_DB_PASS_%02u", dwGroupIndex);
const char* szServerNameBuffer = ServerInfoTXT.GetValue(szServerNameKey);
const char* szServerAddressBuffer = ServerInfoTXT.GetValue(szServerAddressKey);
const char* szDBServerBuffer = ServerInfoTXT.GetValue(szDBServerKey);
const char* szDBNameBuffer = ServerInfoTXT.GetValue(szDBNameKey);
const char* szDBAccountBuffer = ServerInfoTXT.GetValue(szDBAccountKey);
const char* szDBPassBuffer = ServerInfoTXT.GetValue(szDBPassKey);
if(szServerNameBuffer && szServerAddressBuffer
&& szDBServerBuffer && szDBNameBuffer
&& szDBAccountBuffer && szDBPassBuffer)
{
strncpy(stAgentServerInfo.szServerName, szServerNameBuffer, MAX_BUFFER);
strncpy(stAgentServerInfo.szServerAddress, szServerAddressBuffer, MAX_BUFFER);
strncpy(stAgentServerInfo.szDBServer, szDBServerBuffer, MAX_BUFFER);
strncpy(stAgentServerInfo.szDBName, szDBNameBuffer, MAX_BUFFER);
strncpy(stAgentServerInfo.szDBAccount, szDBAccountBuffer, MAX_BUFFER);
strncpy(stAgentServerInfo.szDBPass, szDBPassBuffer, MAX_BUFFER);
stAgentServerInfo.szServerName[MAX_BUFFER - 1] = 0;
stAgentServerInfo.szServerAddress[MAX_BUFFER - 1] = 0;
stAgentServerInfo.szDBServer[MAX_BUFFER - 1] = 0;
stAgentServerInfo.szDBName[MAX_BUFFER - 1] = 0;
stAgentServerInfo.szDBAccount[MAX_BUFFER - 1] = 0;
stAgentServerInfo.szDBPass[MAX_BUFFER - 1] = 0;
}
else
{
return false;
}
return true;
}
void CAgentServerTable::SetNULL(unsigned long dwServerGroup)
{
//m_lpAgentServerDispatch[dwServerGroup] = NULL;
}