Files
mir_server/server/LogicServer/session/LogicSSClient.h

166 lines
5.2 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
/***************************************************************/
/*
/* 逻辑服务器会话管理器
/*
/* 实现逻辑服务器与会话服务器的通信以及逻辑服务器中的全局会话管理
/*
/***************************************************************/
class CLogicServer;
class CActor;
class CLogicSSClient :
public CCustomSessionClient
{
public:
typedef CCustomSessionClient Inherited;
public:
CLogicSSClient(CLogicServer *lpLogicServer);
~CLogicSSClient();
typedef struct tagAccountPasswd
{
ACCOUNT account; //玩家的账户
char passwd[MAX_PASSWD_LENGTH];
}ACCOUNTPASSWD,*PACCOUNTPASSWD;
/*
* Comments: 广
* Param const LPCVOID pData:
* Param const SIZE_T nLen:
* @Return void:
* @Remark:
*/
void BroadMsgToCommonLogicClient(LPCVOID pData, const SIZE_T nLen);
/*
* Comments:
* Param const LPCVOID pData:
* Param const SIZE_T nLen:
* @Return void:
* @Remark:
*/
void SendMsgToDestLogicClient(int nCmd, int nDestServerId, LPCVOID pData, const SIZE_T nLen);
/*
* Comments: 广
* Param const LPCVOID pData:
* Param const SIZE_T nLen:
* @Return void:
* @Remark:
*/
void BroadMsgToLogicClient(int nCmd, LPCVOID pData, const SIZE_T nLen);
virtual void OnRountine()
{
Inherited::OnRountine();
}
public:
/*
* Comments: ID相关连的游戏角色的
* Param INT_PTR nSessionId: ID
* Param CActor * pActor:
* @Return VOID:
*/
inline VOID PostSetSessionPlayer(INT_PTR nSessionId, CActor *pActor,UINT64 lKey)
{
PostInternalMessage(SCIM_SET_SESSION_PLAYER, nSessionId,(UINT64)pActor,lKey);
}
/*
* Comments:线
* @Return VOID:
*/
VOID SendOnlinePlayerCount(INT_PTR nCount);
// 回收空闲的CDataPacket类
void FreeBackUserDataPacket(CDataPacket* pDataPacket);
//玩家发数据包过来,准备进入游戏
void PostLogin(char *sAccountName,char *sPasswd);
//向会话服务器报告自己的服务器的ID
VOID SendServerIndex();
protected:
//继承基类的,处理网络消息
VOID OnDispatchRecvPacket(const jxSrvDef::INTERSRVCMD nCmd, CDataPacketReader &inPacket);
/* 查询本地服务器的名称,以便正确的向会话服务器注册连接 */
LPCSTR getLocalServerName() ;
/* 创建一个会话对象默认的操作是使用m_Allocator申请一份会话对象内存 */
CCustomGlobalSession* CreateSession();
/* 销毁一个会话对象默认的操作是将会话对象释放回m_Allocator中 */
VOID DestroySession(CCustomGlobalSession* pSession);
/* 当会话服务器告知有新会话打开的时,当创建会话对象并填充基本数据后调用
*pSession
*boIsNewSession 线
*/
VOID OnOpenSession(CCustomGlobalSession* pSession, BOOL boIsNewSession);
/* 当一个会话被关闭时调用
*nSessionID ID
*/
VOID OnCloseSession(CCustomGlobalSession* pSession);
/* 当被动(由会话服务器广播而进行的)更新会话状态的时候调用此函数
*pSession
*oldState
*newState
*/
VOID OnUpdateSessionState(CCustomGlobalSession* pSession, jxSrvDef::GSSTATE oldState, jxSrvDef::GSSTATE newState);
/* 查询全局会话关联的用户是否在线
*nSessionId ID
* ID关联的用户是否存在
* 使PostInternalMessage的形式向其他线程的对象发送消息线
* 使PostQuerySessionExistsResult返回查询用户是否在线的结果
*/
VOID OnQuerySessionExists(INT_PTR nSessionId);
//覆盖工作线程停止时的操作
VOID OnWorkThreadStop();
jxSrvDef::SERVERTYPE getLocalServerType()
{
return jxSrvDef::GameServer;
}
int getLocalServerIndex();
//连接起来的时候向会话发送本服的index和公共服的index
virtual VOID OnConnected();
protected:
//处理内部消息
VOID DispatchInternalMessage(UINT uMsg, UINT64 uParam1, UINT64 uParam2, UINT64 uParam3,UINT64 uParam4);
private:
//销毁所有全局回话对象所占的内存
VOID FreeSessionBuffers();
// 分配一个CDataPacket
CDataPacket* AllocSendPacket();
private:
CLogicServer *m_pLogicServer; //所属逻辑服务器
CBaseList<CCustomGlobalSession*>m_FreeSessionList; //空闲全局会话列表
CBaseList<void*> m_SessionMemList; //全局会话内存块头部指针列表
CQueueList<CDataPacket*> m_vFreeList; //用来存放空闲的数据包
CCSLock m_vFreeListLock;
CQueueList<ACCOUNTPASSWD> m_accountPasswd; //用户名密码信息,避免频繁的申请
private:
/** 内部消息列表 **/
static const INT_PTR SCIM_SET_SESSION_PLAYER = 201; //设置会话游戏角色对象Param1=会话IDParam2=角色对象
};