Files
Sun1602/Server/MasterServer/MasterServer.h
T
2022-10-26 12:25:11 +08:00

175 lines
6.2 KiB
C++

#ifndef _MASTERSERVER_H_
#define _MASTERSERVER_H_
#include <windows.h>
#include <Singleton.h>
#include <map>
#include <const.h>
#include <Timer.h>
// 서버 통화량 위해
#include <ServerStruct.h>
#include <SolarHashTable.h>
#include <vector>
using namespace std;
class IOCPServer;
class Session;
class GameDBProxySession;
class AccountDBProxySession;
class OpServerSession;
class RemoteServerSession;
class NetworkObject;
struct SERVER_MONEY_INFO;
class ServerSession;
class SolarAuthServerSession;
typedef util::SolarHashTable<SERVER_KEY*> SERVERKEY_HASH;
typedef util::SolarHashTable<SERVER_KEY*>::iterator SERVERKEY_HASH_ITR;
// 실제 접속중인 서버 키 보관(Key = SERVER_KEY)
typedef vector<SERVER_KEY> SERVERKEY_VEC;
typedef SERVERKEY_VEC::iterator SERVERKEY_VEC_ITER;
// 채널 단위로 접속중인 서버 목록 보관(Key = ChannelIndex)
typedef map<BYTE, SERVERKEY_VEC> CHANNEL_MAP;
typedef CHANNEL_MAP::iterator CHANNEL_MAP_ITER;
typedef pair<BYTE, SERVERKEY_VEC> CHANNEL_MAP_PAIR;
// 월드 단위로 접속중인 서버 목록 보관(Key = WorldIndex)
typedef map<BYTE, CHANNEL_MAP> WORLD_MAP;
typedef WORLD_MAP::iterator WORLD_MAP_ITER;
typedef pair<BYTE, CHANNEL_MAP> WORLD_MAP_PAIR;
//#define _WHATTHEHELL_AGENTSHUTDOWN_20060524
enum eEXIT_TYPE
{
eEXIT_NONE, // 안하는 상태
#ifdef _WHATTHEHELL_AGENTSHUTDOWN_20060524
eEXIT_AGENTSTART, // Agent서버 종료 시작
eEXIT_AGENTWAIT, // 종료 패킷 보내고 대기중
#endif
eEXIT_GAMESTART, // Game서버 종료 시작
eEXIT_GAMEWAIT, // 종료 패킷 보내고 대기중
eEXIT_DBPROXY, // GameDBProxy 종료 시작
eEXIT_DBPROXYWAIT, // 종료 패킷 보내고 대기중
eEXIT_END, // 빨래 끝~
};
class MasterServer : public Singleton<MasterServer>
{
enum
{
IOHANDLER_KEY = 0,
INSIDE_IOHANDLER = IOHANDLER_KEY,
OUTSIDE_IOHANDLER = 1,
MAX_SIZE_IOHANDLER = 2
};
friend NetworkObject* CallBackOnAccept( DWORD dwNetworkIndex );
friend VOID CallBackOnDisconnect( DWORD dwSessionIndex, NetworkObject *pNetworkObject );
public:
MasterServer();
~MasterServer();
BOOL Init();
VOID Release();
VOID Run();
BOOL Update();
VOID StartListen();
VOID ConnectToServer( NetworkObject *pNetworkObject, char *pszIP, WORD wPort );
#ifdef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__
VOID ConnectToServerOutside( NetworkObject *pNetworkObject, char *pszIP, WORD wPort );
static VOID StartDataService();
inline ePHASE_SHIFT GetPhaseStatus() { return m_PHASE_SHIFT; }
inline VOID SetPhaseStatus( ePHASE_SHIFT phase ) { m_PHASE_SHIFT = phase; }
#endif //__WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__
inline VOID Shutdown() { m_bShutdown = TRUE; }
inline BOOL IsOnShutdown() { return m_bShutdown; }
BOOL IsConnectedTo( eSERVER_TYPE eServerType );
// VOID SetMoney( SERVER_KEY serverkey, ULONGLONG &ui64GetMoney, ULONGLONG &ui64LoseMoney, ULONGLONG &ui64UserMoney );
// BOOL GetMoney( SERVER_KEY serverkey, ULONGLONG &ui64GetMoney, ULONGLONG &ui64LoseMoney, ULONGLONG &ui64UserMoney );
// VOID RemoveMoney( SERVER_KEY serverkey );
// DWORD GetMoneyInfoNum();
// VOID SetMoneyInfoFirst();
// SERVER_MONEY_INFO* GetMoneyInfoNext();
inline eSERVER_TYPE GetServerType() { return MASTER_SERVER; }
// 서버 종료 관련
inline BOOL IsExitServer() { return m_bExitServer; }
inline VOID SetExitServer( BOOL bExit = TRUE ) { m_bExitServer = bExit; m_bExitFailed = FALSE; }
inline VOID SetExitKey( DWORD dwKey, __int64 i64WopsKey ) { m_dwExitKey = dwKey; m_i64WopsKey = i64WopsKey; }
inline DWORD GetExitKey() { return m_dwExitKey; }
inline __int64 GetExit64Key() { return m_i64WopsKey; }
inline eEXIT_TYPE GetExitType() { return m_eExitType; }
inline VOID SetExitType( eEXIT_TYPE eExit ) { m_eExitType = eExit; }
#ifdef _WHATTHEHELL_AGENTSHUTDOWN_20060524
BOOL AddExitAgentServer( SERVER_KEY sServerKey );
VOID RemoveExitAgentServer( SERVER_KEY serverKey );
#endif
BOOL AddExitServer( SERVER_KEY sServerKey ); // 종료할 서버 추가
VOID RemoveExitServer( SERVER_KEY serverKey ); // 종료할 서버 삭제
BOOL AddExitDBServer( SERVER_KEY sServerKey ); // 종료할 서버(DB) 추가
VOID RemoveExitDBServer( SERVER_KEY sServerKey ); // 종료할 서버(DB) 삭제
BOOL CheckExitServer(); // 종료 명령 받았는지 확인하고, 종료되었으면 TRUE
inline ServerSession* GetOpServer() { return (ServerSession*)m_pOpServerSession; }
inline ServerSession* GetAccountDBProxyServer() { return (ServerSession*)m_pAccountDBProxySession; }
VOID AddServerMap( SERVER_KEY &serverKey );
VOID RemoveServerMap( SERVER_KEY &serverKey );
VOID CheckServerMoney();
VOID CheckStatistics();
VOID CheckServerWarehouseMoney();
VOID SendMoneyReq();
BOOL SendRestrictReq();
VOID SendRestrictAns();
private:
BOOL ProcessConsole();
VOID UpdateFPS();
VOID DisplayServerInfo();
VOID MaintainConnection();
#ifdef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__
private:
SolarAuthServerSession* m_pSolarAuthServerSession;
ePHASE_SHIFT m_PHASE_SHIFT;
//GLOBAL_SERVER_INFO...
#endif
IOCPServer *m_pIOCPServer;
AccountDBProxySession *m_pAccountDBProxySession;
OpServerSession *m_pOpServerSession;
BOOL m_bShutdown;
DWORD m_dwFPS;
util::Timer m_ReconnectTimer;
util::SolarHashTable<SERVER_MONEY_INFO *> *m_pServerMoneyInfoTable;
SERVER_KEY m_ExitServerKey; // RTTA에서 받은 정상종료 프로토콜에서 가리키는 서버 키
BOOL m_bExitServer; // 서버 정상종료중인가?
DWORD m_dwExitKey; // RTT에서 보내주는 종료 키. 그대로 보관했다가 돌려줘야 한다
__int64 m_i64WopsKey; // RTT에서 보내주는 종료 키2. 그대로 보관했다가 돌려줘야 한다
eEXIT_TYPE m_eExitType; // 종료 패킷 보낸 상태인가?
#ifdef _WHATTHEHELL_AGENTSHUTDOWN_20060524 // 에이전트부터 먼저 종료하는 코드
SERVERKEY_HASH *m_pExitAgentTable; // 정상종료 프로토콜 받았을 때 Agent 먼저 종료시키는 부분
#endif
SERVERKEY_HASH *m_pExitServerTable; // 정상종료할 서버 목록-종료 프로토콜 받는 순간 접속된 서버들을 저장
SERVERKEY_HASH *m_pExitDBServerTable; // 정상종료할 GameDBProxy서버 목록-종료 프로토콜 받는 순간 접속된 서버들을 저장
util::Timer m_ExitTimer; // 종료 대기용 타이머
BOOL m_bExitFailed; // 종료 실패(이 상태면 이후로 패킷을 RTT로 보내지 않는다)
WORLD_MAP m_WorldMap;
util::Timer m_MoneyTimer; // 각 Game서버에서 통화량 정보 얻어오는 주기
};
#endif // _MASTERSERVER_H_