182 lines
7.7 KiB
C++
182 lines
7.7 KiB
C++
#ifndef _CROSS_SERVER_H_
|
||
#define _CROSS_SERVER_H_
|
||
/*****************************************************************
|
||
Copyright (c) 2021, 上海漫方网络科技有限公司
|
||
All rights reserved
|
||
|
||
创建日期: 2021年04月28日 14时01分
|
||
文件名称: CrossServer.h
|
||
说 明: 跨服引擎类
|
||
|
||
当前版本: 1.00
|
||
作 者:
|
||
概 述: 跨服引擎类
|
||
|
||
*****************************************************************/
|
||
class CCrossClient;
|
||
class CCrossServerManager;
|
||
using namespace jxSrvDef;
|
||
class CCrossServer
|
||
: public CCustomServerSocket
|
||
{
|
||
public:
|
||
friend class CCrossClient;
|
||
typedef CCustomServerSocket Inherited;
|
||
//定义枚举客户连接的回调函数类型,第一个LPVOID类型的参数是一个穿透性的参数。函数返回0表示继续枚举,否则表示终止枚举
|
||
typedef UINT (__stdcall *EnumConnectionFn) (LPCVOID, CCrossClient*);
|
||
|
||
|
||
|
||
private:
|
||
//发送记录各个服务器的在线人数
|
||
VOID SendLogOnlineCount();
|
||
protected:
|
||
//覆盖创建连接对象的函数
|
||
CCustomServerClientSocket* CreateClientSocket(SOCKET nSocket, PSOCKADDR_IN pAddrIn);
|
||
//覆盖处理客户端连接的函数
|
||
VOID ProcessClients();
|
||
//覆盖的开启服务的函数
|
||
BOOL DoStart();
|
||
//覆盖的停止服务的函数
|
||
VOID DoStop();
|
||
//覆盖内部消息分派函数
|
||
VOID DispatchInternalMessage(UINT uMsg, UINT64 uParam1, UINT64 uParam2, UINT64 uParam3,UINT64 uParam4);
|
||
//覆盖例行执行函数
|
||
VOID SingleRun();
|
||
private:
|
||
|
||
//关闭会话,操作的依据是会话在列表中的索引,而非会话ID或账号字符串
|
||
BOOL CloseSessionAtListIndex(const INT_PTR nIndex);
|
||
|
||
private:
|
||
//向所有DB客户端以及指定ID的引擎客户端发送消息,消息将被立刻追加到客户端发的发送缓冲中。数据包必须是完成的格式(包含包头和包尾)
|
||
INT_PTR SendAllDBAndIndexEngineMsg(const INT_PTR nServerIndex, LPCSTR sMsg, const size_t dwSize);
|
||
|
||
//广播会话状态变更的消息
|
||
INT_PTR BroadCastUpdateSessionState(PGAMECROSS pSession);
|
||
|
||
|
||
/*
|
||
* Comments:广播删除一个会话,如果nServerIndex=-1则所有的广播,否则只向特定的服务器广播
|
||
* Param const UINT64 nSessionId:会话的id
|
||
* Param const int nServerIndex:服务器的编号
|
||
* @Return INT_PTR:
|
||
*/
|
||
INT_PTR BroadCastCloseSession(const UINT64 nSessionId,Uint64 lKey, const int nServerIndex=-1 );
|
||
|
||
//广播确认会话是否在线
|
||
INT_PTR BroadCastSessionConfim(const UINT64 nSessionId, const INT_PTR nServerIndex);
|
||
|
||
//广播要删除这个玩家,玩家登陆的时候,如果在线,直接踢出这个角色
|
||
//INT_PTR BroadcastKickUser(const INT_PTR nSessionId,const INT_PTR nServerIndex);
|
||
|
||
//初始化账户的唯一,为了保证账户的唯一,account的最小值为 spguid << 24 +1 ,这样保证全球所有的账户都是唯一的
|
||
bool InitACCountId();
|
||
|
||
//初始化所有的数据
|
||
bool InitRankMsg();
|
||
|
||
//保存所有的rank数据
|
||
bool SaveRankMsg();
|
||
|
||
|
||
//向日志服发送当前ip的登陆情况
|
||
void SendOnlineIpStatus();
|
||
|
||
//获取int类型的ip
|
||
long long GetIntIp(char *sIp); //
|
||
|
||
public:
|
||
|
||
//通过账号字符串获取会话指针,如果lpIndex参数非空,则会向指针指向的内存填充值为会话在列表中的索引
|
||
//此函数非常的慢!
|
||
PGAMECROSS GetSessionPtrByAccount(LPCSTR sAccount, PINT_PTR lpIndex = NULL);
|
||
|
||
// 给连接到指定公共服务器的逻辑服务器广播消息
|
||
INT_PTR SendGroupLogicClientMsg(const int nCommServerId, LPVOID data, const SIZE_T nSize);
|
||
|
||
//向所有客户端送消息,消息将被立刻追加到客户端发的发送缓冲中。数据包必须是完成的格式(包含包头和包尾)
|
||
//参数eServerType表示服务器类型,InvalidServer表示向所有类型的服务器发送,否则向类型为eServerType的所有服务器发送
|
||
INT_PTR SendMsg2AllClient(const SERVERTYPE eServerType, LPCSTR sMsg, const size_t dwSize);
|
||
|
||
//向指定ID的逻辑户端发送消息,消息将被立刻追加到客户端发的发送缓冲中。数据包必须是完成的格式(包含包头和包尾)
|
||
INT_PTR SendMsg2LogicClient(const INT_PTR nServerIndex, LPCSTR sMsg, const size_t dwSize);
|
||
|
||
//获取会话指针,如果lpIndex参数非空,则会向指针指向的内存填充值为会话在列表中的索引
|
||
PGAMECROSS GetSessionPtr(const unsigned int nSessionId,PINT_PTR lpIndex = NULL,Uint64 lKey= (Uint64)-1,int nServerIndex =-1);
|
||
|
||
|
||
CCrossServer(CCrossServerManager *lpSSManager);
|
||
~CCrossServer();
|
||
|
||
//向所有服务器投递消息,消息将在逻辑循环中被发送而不是立即发送。数据包必须是完成的格式(包含包头和包尾)
|
||
//参数eServerType表示服务器类型,stInvalid表示向所有类型的服务器发送,否则向类型为eServerType的所有服务器发送
|
||
VOID PostAllClientMsg(const SERVERTYPE eServerType, LPCSTR sMsg);
|
||
|
||
|
||
//获取会话数据,如果会话存在则返回TRUE并为pSession填充会话数据内容
|
||
BOOL GetSession(const INT_PTR nSessionId,OUT PGAMECROSS pSession,int nServerIndex =-1);
|
||
|
||
|
||
//查找某个特定服会话的指针
|
||
PGAMECROSS GetSpecialServerSession(const INT_PTR nSessionId, const int nServerIndex);
|
||
|
||
//踢掉在线的用户
|
||
VOID PostKickCrossActor(const INT_PTR nSessionId, const int nServerIndex);
|
||
|
||
//处理剔除跨服用户
|
||
void ProcessKickCrossActor(const unsigned int nSessionId, const int nServerIndex);
|
||
|
||
//获取1个ip登陆的个数
|
||
int GetLoginAccountCount(LONGLONG lIp);
|
||
|
||
|
||
//获取当前全局会话数量
|
||
inline INT_PTR GetSessionCount(){ return m_SessionList.count(); }
|
||
//获取已经连接的逻辑服务器客户端数量,如果nServerIndex参数为0,则统计所有逻辑客户端数量
|
||
INT_PTR GetLogicClientCount(const INT_PTR nServerIndex);
|
||
//判断用户是否可以登录到目的服务器,返回0表示可以登录。如果服务器的会话客户端未连接则返回-1,如果服务器人员已满,则返回-2,
|
||
INT_PTR UserCanLoginToServer(const INT_PTR nServerIndex);
|
||
|
||
//投递开启新会话的消息
|
||
BOOL PostOpenSession(const INT_PTR nServerIndex, // 登录的逻辑服务器ID
|
||
const INT_PTR nRawServerIndex, // 原始的服务器ID
|
||
LPCSTR sAccount, // 登录用户名
|
||
const unsigned int nSessionId, // 会话ID(账号ID)
|
||
const INT_PTR nIPAddr, // 登录IP地址
|
||
const INT_PTR dwTodayOnlineSec, // 今天在线时间
|
||
INT_PTR nGmLevel, // GM等级
|
||
UINT64 lKey , // 在逻辑服的key
|
||
INT_PTR nGateIndex, //在网关的编号 ,
|
||
bool bIsWhiteLogin, // 是否是白名单登陆的
|
||
bool bCommonMsg=false //是否中心会话服转发过来的消息
|
||
);
|
||
|
||
//投递按账号字符串关闭会话的消息,用于管理用
|
||
VOID PostCloseSessionByAccount(const LPCSTR sAccount);
|
||
|
||
//关闭一个会话
|
||
VOID PostCloseSessionByAccountId(Uint64 nAccountId,UINT64 lKey);
|
||
|
||
|
||
//遍历所有的连接,lpFn是毁掉函数指针,lpParam是穿透参数会传递给对调函数。
|
||
VOID EnumConnections(EnumConnectionFn lpFn, LPCVOID lpParam);
|
||
|
||
CCrossServerManager* GetCSManager() { return m_pCSManager; }
|
||
|
||
|
||
//从会话中心服回来的跨平台请求结果
|
||
void OnSendPlatformResultToClient(int nServerIndex,CDataPacketReader &inPacket);
|
||
|
||
private:
|
||
CQueueList<PGAMECROSS> m_SessionList; //会话列表
|
||
CCSLock m_SessionListLock; //会话列表锁
|
||
CCrossServerManager* m_pCSManager; //所属会话管理器
|
||
INT_PTR m_nEngineClientCount;//引擎客户端数量
|
||
TICKCOUNT m_dwCheckOnlineLogTick;//下次检查记录在线人数的时间
|
||
BOOL m_boOnlineLoged; //是否已经记录在线人数
|
||
};
|
||
|
||
#endif//_CROSS_SERVER_H_
|
||
|