📄 servertable.h
字号:
// -------------------------------
// New RAJA Server Table
//
// Rewrote By chan78 at 2000/12/27
// -------------------------------
#ifndef SERVERTABLE_H
#define SERVERTABLE_H
#pragma once
#include "ServerIdentity.h"
#ifdef __IS_MAP_SERVER
#include "..\Stdafx.h"
#else
#include "Stdafx.h"
#endif
#include "define.h"
#include "packed.h"
#include "inetwork.h"
#include "protocol.h"
#include "MyLog.h"
#ifdef __IS_DB_DEMON
#include "struct.h"
#endif
class CPackedMsg;
enum SERVER_TYPE
{
SERVER_TYPE_MAP = 0,
SERVER_TYPE_DB = 1,
SERVER_TYPE_AGENT = 2,
SERVER_TYPE_PROXY = 3
};
enum FINISH_TYPE
{
FINISH_TYPE_NORMAL = 0,
FINISH_TYPE_UNKNOWN_ERROR = 1,
FINISH_TYPE_SERVER_LIST_ACCEPT_FAIL = 2,
FINISH_TYPE_BY_PROXY = 3,
FINISH_TYPE_BIND_FAILED = 4,
FINISH_TYPE_BOOT_FAIL = 5,
FINISH_TYPE_PROXY_LOST_CONNECTION_UNDER_BOOT_PROGRESS = 6
};
enum SERVER_STATUS
{
STATUS_NOT_IN_NETWORK = 0,
STATUS_TRYING_TO_CONNECT = 1,
STATUS_AWAITING_PROXY_CONNECTION = 2,
STATUS_SERVER_LIST_CERTIFIED = 3,
STATUS_AWAITING_SERVER_LIST = 4,
STATUS_AWAITING_SET_SERVER_LIST_RESULT = 5,
STATUS_AWAITING_CONNECTION_ORDER = 6,
STATUS_AWAITING_CONNECTION_RESULT = 7,
STATUS_AWAITING_DB_DEMON_SETTING = 8,
STATUS_AWAITING_SET_DB_DEMON_RESULT = 9,
STATUS_ACTIVATED = 10,
STATUS_INACTIVATED = 11,
STATUS_CLOSING = 12,
STATUS_RELOAD_GAMESERVER_DATA = 13, //Added by KBS 020120
STATUS_FINISH_RELOAD_GAMESERVER_DATA = 14 //Added by KBS 020120
};
enum CONNECTION_STATUS
{
CONNECTION_STATUS_NOT_LISTED = 0,
CONNECTION_STATUS_NOT_CONNECTED = 1,
CONNECTION_STATUS_TRYING_TO_CONNECT = 2,
CONNECTION_STATUS_CONNECTED_BETWEEN = 3,
CONNECTION_STATUS_CONNECTED = 4,
CONNECTION_STATUS_ACCEPTED = 5,
};
enum CONNECT_TYPE
{
CONNECT_TYPE_NONE = 0,
CONNECT_TYPE_WITH_PROXY = 1,
CONNECT_TYPE_BATCH = 2,
CONNECT_TYPE_BY_PROXY_ORDER = 3
};
#define CONNECTION_CHECK_INTERVAL 60000 // 1盒 (mil-sec 窜困)
#define SERVER_CONNECTION_TIME_OUT CONNECTION_CHECK_INTERVAL+30000 // 30檬 (mil-sec 窜困)
#define NUM_OF_SERVER_TYPES 4
#define NUM_OF_SERVER_STATUS 15 //Modified by KBS 020120
#define PROXY_SERVER_PORT_START 3000
#define PROXY_SERVER_PORT_FINISH 3999
#define DB_DEMON_PORT_START 4000
#define DB_DEMON_PORT_FINISH 4999
#define MAP_SERVER_PORT_START 5000
#define MAP_SERVER_PORT_FINISH 6999
#define AGENT_SERVER_PORT_START 7000
#define AGENT_SERVER_PORT_FINISH 7999
#define PRIMARY_SERVER 0
#define SECONDARY_SERVER 1
#define TYPE_SERVER_SIDE 0
#define TYPE_USER_SIDE 1
#define ERROR_UNKNOWN 0
#define ERROR_SERVER_CONNECTION_TIMED_OUT 1
#define SERVER_DEFAULT_OVERHEAD 10000
typedef struct communication_statistics_data
{
// Total by bytes
DWORD dwTotalSendSize;
DWORD dwTotalReceivedSize;
// Total by Packets
DWORD dwTotalSendPackets;
DWORD dwTotalReceivedPackets;
// with each Servers by Size
DWORD dwBetweenServersSendSize[MAX_SERVER_NUM];
DWORD dwBetweenServersReceivedSize[MAX_SERVER_NUM];
// with each Servers by Packet
DWORD dwBetweenServersSendPackets[MAX_SERVER_NUM];
DWORD dwBetweenServersReceivedPackets[MAX_SERVER_NUM];
// by PTCLs
DWORD dwServerSendPTCLs[256];
DWORD dwServerReceivedPTCLs[256];
// Classified Period
DWORD dwPeriod; // mil-sec
// Classified Time
DWORD dwStartTime;
DWORD dwFinishTime;
} COMMUNICATION_STATISTICS_DATA, *LP_COMMUNICATION_STATISTICS_DATA;
typedef struct hashed_server_data
{
WORD wPosInHashTable;
struct server_data* pServerData;
struct hashed_server_data* pPrevHashedServerData;
struct hashed_server_data* pNextHashedServerData;
} HASHED_SERVER_DATA, *LP_HASHED_SERVER_DATA;
typedef struct server_data
{
#ifdef __IS_PROXY_SERVER
WORD wServerIndex;
struct server_data *ppUsingServers[MAX_SERVER_NUM];
struct server_data *pUsingDBDemon;
#endif
#ifdef __IS_DB_DEMON
IDCN dwUSERCN[MAX_USER_NUM];
#endif
DWORD dwNumOfUsers;
char szIP[MM_IP_LENGTH]; // Server Side
WORD wPort; // Server Side
SERVER_TYPE dwServerType; // Server Side
DWORD dwConnectionIndex; // Server Side
DWORD dwStatus; // Server Side
DWORD dwConnectType; // Connect Type
DWORD dwLastCheckAliveTime; // For CheckAlive
char szIPForUser[MM_IP_LENGTH]; // User Side
WORD wPortForUser; // User Side
LP_HASHED_SERVER_DATA pHashedServerData; // Link For Hash Table
struct server_data* pNextServerData;
} SERVER_DATA, *LP_SERVER_DATA;
// 茄 笼钦狼 立加矫档 搬苞甫 眉农窍绰单 静牢促.
typedef struct awaiting_connection_result_data
{
DWORD dwConnectionType;
DWORD dwToConnectServers;
DWORD dwResultCheckedServers;
char szAnswer[MM_MAX_PACKET_SIZE]; // To Answer target
LP_SERVER_DATA pSender; // To Answer target
} AWAITING_CONNECTION_RESULT_DATA, *LP_AWAITING_CONNECTION_RESULT_DATA;
typedef void (*ONCONFUNC)( LP_SERVER_DATA pServerData );
typedef void (*ONDISCONFUNC)( LP_SERVER_DATA pServerData );
typedef bool (*RECVMSGFUNC)( LP_SERVER_DATA pServerData, PTCL bID, char* pMsg, DWORD dwLength );
class CServerTable
{
private:
// Private Members -------------------------------------------------
// added by slowboat
DWORD m_dwMaxUserNum;
DWORD m_dwMaxUserNumPerSec;
DWORD m_dwNumOfUsersInServerSet;
WORD m_wMaxBucketNum; // Hashing 侩 Bucket
bool m_bIsServerRunning; // Is Server Running
char m_szNewMsg[MM_MAX_PACKET_SIZE]; // 菩哦 Build侩 滚欺.
DWORD m_dwServerSetNumber; // 技飘.
DWORD m_dwNumOfServerConnections; // Serverside connections 荐.
DWORD m_dwNumOfServers; // 傈眉 Server 狼 荐.
DWORD m_dwNumOfTypedServers[NUM_OF_SERVER_TYPES]; // Server Type 喊 Server 荐.
DWORD m_dwNumOfConnectedServers; // 沥惑累悼吝牢 Server狼 荐.
DWORD m_dwNumOfUsers; // 荤侩磊 荐.
LP_SERVER_DATA m_pOwnProxyServerData[2]; // PROXY Server狼 Pointer;
LP_SERVER_DATA m_pOwnDBDemonData; // DB Server狼 Pointer;
LP_SERVER_DATA m_pServerListHead; // Server List 狼 Head
LP_SERVER_DATA m_pServerListTail; // Server List 狼 Tail
LP_SERVER_DATA m_pOwnServerData; // Server狼 磊扁沥焊.
AWAITING_CONNECTION_RESULT_DATA m_ConnectionResultData; // 橇遏矫俊霸 立加 搬苞甫 舅府扁 困秦 静牢促.
CPackedMsg** m_ppPackedTable; // CPackedMsg 抛捞喉
HASHED_SERVER_DATA** m_ppServerTable; // Server HashTable
I4DyuchiNET* m_pINet; // INet Interface
CRITICAL_SECTION m_IsRunningCriticalSection; // Critical Sections
COMMUNICATION_STATISTICS_DATA m_CommStatisticsData; // 傈价樊 烹拌侩 备炼眉.
#ifdef __IS_PROXY_SERVER
CRITICAL_SECTION m_IsUserAcceptAllowedCriticalSection;
BYTE m_bConnectionStatus[MAX_SERVER_NUM][MAX_SERVER_NUM];
bool m_bIsUserAcceptAllowed;
#endif
// -----------------------------------------------------------------
// Private Methods -------------------------------------------------
void RemoveAllServerDatasFromTable(); // 葛电 辑滚甫 List俊辑 力芭.
void RemoveAllServerDatasFromList(); // 葛电 辑滚甫 HashTable俊辑 力芭.
void SendServerUpMessage( DWORD index,WORD port ); // SendServer
void OnChangeServerStatus( LP_SERVER_DATA pServerData ); // 辑滚狼 Status 啊 函版等 版快...
void NotifyServerStatus(); // Server 狼 status甫 促弗 辑滚俊 舅覆.
bool NotifyServerStatus( LP_SERVER_DATA pToServer ); //
bool ReportServerStatus(); // 辑滚狼 Status 甫 PROXY俊 舅覆.
bool ReportServerStatus( LP_SERVER_DATA pToServer ); //
// -----------------------------------------------------------------
public:
// Public Methods --------------------------------------------------
void ShowServerStatus();
void SendPackedMsg();
void SetServerStatus( DWORD dwStatus );
void SetServerStatus( LP_SERVER_DATA pServerData, DWORD dwStatus );
void OnConnectTypedServer( LP_SERVER_DATA pServerData );
void OnDisconnectTypedServer( LP_SERVER_DATA pServerData );
void DestroyServer( DWORD dwFinishType );
void CheckServerConnections();
void CloseServerConnection( LP_SERVER_DATA pServerData );
void CloseServerConnection( WORD wPort );
void ReportOrderedConnectionResult();
// 烹拌侩...
// void CollectTransStatistics( DWORD dwType, DWORD size );
bool AddServerDataToList( SERVER_DATA *pSeverData );
bool AddConnectedServerDataToHashTable( SERVER_DATA *pServerData, DWORD dwConnectionIndex );
bool StartServer( DWORD dwType );
bool ConnectToProxyServer();
bool ConnectToServer( LP_SERVER_DATA pServerData, DWORD dwConnectType );
bool ConnectToServer( WORD wServerID, DWORD dwConnectType );
bool InitServerTable( char* sFileName );
bool Send( WORD wServerID, char* pMsg, DWORD dwLength );
bool Send( DWORD dwConnectionIndex, char* pMsg, DWORD dwLength );
bool SendToProxyServer( char *pMsg, DWORD dwLength );
bool SendToDBDemon( char *pMsg, DWORD dwLength );
bool SendToDBDemon( DWORD dwConnectionIndex, char *pMsg, DWORD dwLength );
bool RemoveConnectedServerDataFromHashTable( DWORD dwConnectionIndex );
bool RequestToSetDBDemon();
bool IsServerActivated( LP_SERVER_DATA pServerData );
bool IsServerActivated( WORD wServerID );
bool IsServerRunning();
bool OnRecvNegotiationMsgs( LP_SERVER_DATA pSender, BYTE bID, char *pMsg, DWORD dwLength );
bool OnRecvServerUpMsg( DWORD dwConnectionIndex, WORD wPort );
bool OnRecvDestroyServerMsg( LP_SERVER_DATA pSender, BYTE bID, char *pMsg, DWORD dwLength );
bool ReportServerConnectionStatusChange( LP_SERVER_DATA pServerData, BYTE bConnectionStatus );
bool BeginNegotiationWithProxyServer( LP_SERVER_DATA pServerData );
bool BeginNegotiationWithNormalServer( LP_SERVER_DATA pServerData );
DWORD GetServerSetNum();
DWORD GetNumOfServers();
DWORD GetNumOfTypedServers( SERVER_TYPE dwServerType );
DWORD GetNumOfUsers();
DWORD SetNumOfUsers( DWORD dwNum );
DWORD GetNumOfConnectedServers();
DWORD GetServerStatus();
DWORD BroadCastToEveryServer( char* pMsg, DWORD dwLength );
DWORD BroadCastToEveryServer( char* pMsg, DWORD dwLength, SERVER_TYPE dwTarget );
LP_SERVER_DATA GetConnectedServerData( WORD wServerID );
LP_SERVER_DATA GetConnectedServerData( DWORD dwConnectionIndex );
LP_SERVER_DATA GetServerData( WORD wServerID );
LP_SERVER_DATA GetServerData( DWORD dwConnectionIndex );
LP_SERVER_DATA GetNewServerData( char ip[], WORD port );
LP_SERVER_DATA GetOwnServerData();
LP_SERVER_DATA GetServerListHead();
LP_SERVER_DATA GetOwnProxyServerData();
LP_SERVER_DATA GetOwnDBDemonData();
LP_SERVER_DATA GetAssignableAgentServer();
LP_AWAITING_CONNECTION_RESULT_DATA GetConnectionResultData() { return &m_ConnectionResultData; }
CPackedMsg* GetPackedMsg( DWORD dwConnectionIndex );
CPackedMsg* GetPackedMsg( DWORD* pdwPackedIndex,DWORD dwConnectionIndex );
#ifdef __IS_MAP_SERVER
bool SendRajaPacketToOtherMapServer( WORD wPort, char* szMsg, DWORD dwLength );
#endif
#ifdef __IS_PROXY_SERVER
void AddNumOfUsersInServerSet() { m_dwNumOfUsersInServerSet++; }
void ShowServerConnectionStatus();
void ReBalanceDBDemonSettings();
bool DestroyOtherServer( WORD wServerID );
bool DestroyOtherServer( LP_SERVER_DATA pServerData );
bool IsUserAcceptAllowed();
bool ToggleUserAcceptAllowed();
bool SetDBDemon( LP_SERVER_DATA pTarget );
bool SetDBDemon( LP_SERVER_DATA pTargetServer, LP_SERVER_DATA pDBDemon );
bool SetServerConnectionStatus( LP_SERVER_DATA pServer, LP_SERVER_DATA pServer2, BYTE bType );
bool OrderToReportServerStatus( LP_SERVER_DATA pTargetServer );
bool LinkDBDemonSetting( LP_SERVER_DATA pTarget, LP_SERVER_DATA pDB );
bool ClearDBDemonSetting( LP_SERVER_DATA pServer );
BYTE GetServerConnectionStatus( LP_SERVER_DATA pServer, LP_SERVER_DATA pServer2 );
DWORD GetMaxUserNum() { return m_dwMaxUserNum; }
DWORD GetMaxUserNumPerSec() { return m_dwMaxUserNumPerSec; }
DWORD GetNumOfUsersInServerSet() { return m_dwNumOfUsersInServerSet; }
DWORD BatchConnect();
DWORD GetDBLoad( LP_SERVER_DATA pDBDemon );
DWORD CalcDBLoad( LP_SERVER_DATA pServer );
#endif
// -----------------------------------------------------------------
// Constructor, Destructor -----------------------------------------
CServerTable( char* sFileName, WORD wMaxBucketNum, I4DyuchiNET* pINet );
~CServerTable();
// -----------------------------------------------------------------
};
// Global Variables
extern CServerTable* g_pServerTable;
extern I4DyuchiNET* g_pINet;
// Function Proto-types
char *GetTypedServerText( SERVER_TYPE type );
char *GetServerStatusText( DWORD dwStatus );
char *GetFinishTypeText( DWORD dwStatus );
extern DWORD dwBaseWeight[NUM_OF_SERVER_TYPES];
extern char ServerStatusSymbols[NUM_OF_SERVER_STATUS];
void __stdcall OnConnectServerSuccess( DWORD dwConnectionIndex, void *pVoidTypedServerData );
void __stdcall OnFailedToConnectServer( void *pVoidTypedServerData );
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -