Files
mir_server/server/LogicServer/CrossServer/CrossServer.h

182 lines
7.7 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#ifndef _CROSS_SERVER_H_
#define _CROSS_SERVER_H_
/*****************************************************************
            Copyright (c) 2021, 
                    All rights reserved
       
      20210428 1401
      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_