Files
mir_server/server/LogicServer/gate/LogicGate.h

274 lines
8.1 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
/***************************************************************/
/*
/* 逻辑服务器网关连接对象
/*
/* 实现逻辑服务器中的网关通信以及网关用户管理
/*
/***************************************************************/
class CLogicGateUser;
class CLogicServer;
typedef CQueueList<CDataPacket*> DPVECTOR;
class CLogicGate :
public CCustomServerGate
{
friend class CLogicGateManager;
enum
{
MAX_ACCE_PKG_SIZE = 256*1024,
};
public:
typedef CCustomServerGate Inherited;
static const INT_PTR MAX_GATE_USER = 8192; //最大网关用户数
static int s_nMaxPacketSizes;
public:
CLogicGate();
~CLogicGate();
//
inline void freeBackUserDataList(CBaseList<CDataPacket*> &list)
{
m_vFreeList.appendList(list);
list.trunc(0);
}
inline VOID PostSetActorHandleIndex( int nServerSessionIndex,unsigned nHandleIndex,unsigned int nAccountId)
{
Inherited::PostInternalMessage(SSM_GATE_CREATE_ACTOR, nServerSessionIndex, nHandleIndex,nAccountId);
}
//inline CDataPacket& allocSendPacket()
//{
// return CSendPacketPool::allocSendPacket();
//}
//添加逻辑已经处理过的消息的列表,将他添加到该列表,以后回收利用
inline void AddLogicProcessedData(CDataPacket * pData)
{
m_logicProcDataList.add(pData);
}
inline void AddLogicProcessedDataList(CBaseList<CDataPacket*> &list)
{
m_logicProcDataList.addList(list);
list.clear();
}
//获取逻辑已经处理过的网络消息列表,需要回收利用
inline CBaseList<CDataPacket *> & GetLogicProcecdDataList()
{
return m_logicProcDataList;
}
inline void flushSendPacket(CDataPacket& packet)
{
CSendPacketPool::flushSendPacket(packet);
}
//设置网关的编号
inline void SetGateIndex(int nIndex)
{
m_nGateIndex =nIndex;
}
inline CDataPacket* GetSendToGatePacket()
{
static int sSendPkgCount = 1;
static const unsigned int sMax = ~(0x400-1);
if (m_pSendToGatePacket == NULL)
{
CDataPacket& dp = allocSendPacket();
dp.setPosition(0);
m_pSendToGatePacket = &dp;
if(m_bUseBigPacket)
{
GATEMSGHDR hdr;
hdr.dwGateCode = RUNGATECODE;
hdr.nSocket = 0;
hdr.wSessionIdx= (WORD)1;
hdr.wIdent = GM_APPBIGPACK;
hdr.wServerIdx = 1;
hdr.nDataSize = 0;
hdr.wTemp = RUNTEMPCODE;
hdr.tickCount = 0;
dp << hdr;
}
}
m_nSendPacketCount++;
sSendPkgCount++;
if (sSendPkgCount >= INT_MAX)
sSendPkgCount = 1;
if (sSendPkgCount & sMax)
CheckMemory(true);
return m_pSendToGatePacket;
}
inline VOID SendToGate()
{
if (m_pSendToGatePacket != NULL)
{
//#pragma __CPMSG__(调试结束后要删掉)
// checkcdcd(*m_pSendToGatePacket);
size_t nSize = m_pSendToGatePacket->getLength();
m_ullSendPacketSize += nSize;
/*if (m_pSendToGatePacket->getLength() > s_nMaxPacketSizes)
{
s_nMaxPacketSizes = m_pSendToGatePacket->getLength();
}*/
if (m_bUseBigPacket)
{
GATEMSGHDR *pHeader = (GATEMSGHDR*)m_pSendToGatePacket->getMemoryPtr();
pHeader->nDataSize =(int)( nSize - sizeof(GATEMSGHDR) );
}
FlushGateBigPacket(*m_pSendToGatePacket);
//设置nULL下次再申请
m_pSendToGatePacket = NULL;
}
}
void ResetSendPacketSize() { m_ullSendPacketSize = 0; m_nSendPacketCount = 0; }
unsigned long long GetSendPacketSize() const { return m_ullSendPacketSize; }
int GetSendPacketCount() const { return m_nSendPacketCount; }
void DumpBuffAlloc(wylib::stream::CBaseStream& stream)
{
CBuffAllocStatHelper::Dump(stream, &m_Allocator, _T("LogicGate::CustomWorkSock::Allocator"), false);
/*
CBufferAllocator::ALLOCATOR_MEMORY_INFO mi;
GetPackPoolAllocator()->GetMemoryInfo(&mi);
CBuffAllocStatHelper::Dump(stream, mi, _T("LogicGate::CustomWorkSock::SendPackPool::Allocator"), false);
*/
}
inline void checkcdcd(CDataPacket &pack)
{
PGATEMSGHDR pHdr;
char *buf = pack.getMemoryPtr();
char *pend = buf + pack.getLength();
while (buf < pend)
{
pHdr = (PGATEMSGHDR)buf;
if (pHdr->nDataSize <= 0)
{
//OutputMsg(rmTip, _T("checkcdcd %d"), pHdr->nDataSize);
Assert(0);
}
if (pHdr->nDataSize > 0x8000)
{
//OutputMsg(rmTip, _T("checkcdcd %d"), pHdr->nDataSize);
Assert(0);
}
Assert(pHdr->nDataSize > 0 && pHdr->nDataSize <= 0x8000 );
Assert( pHdr->dwGateCode == RUNGATECODE);
Assert( pHdr->wTemp == RUNTEMPCODE);
buf += sizeof(*pHdr) + pHdr->nDataSize;
}
}
//bool IsConnected() { return connected();}
CCustomSocket::connected;
CSendPacketPool::getPacketCount;
//通过
CLogicGateUser * GetGateUserByKey(UINT64 lKey);
/*
* Comments:
* Param ACCOUNTDATATYPE accountId:id
* Param UINT64 lKey:key
* @Return void:
*/
inline void PostKickUser(ACCOUNTDATATYPE accountId,UINT64 lKey)
{
PostInternalMessage(SSM_KICK_USER,accountId,lKey,0,0);
}
//关闭连接的网关程序
inline void PostCloseGate()
{
PostInternalMessage(SSM_CLOSE_SERVER,0,0,0,0);
}
protected:
VOID DispatchInternalMessage(UINT uMsg, UINT64 uParam1, UINT64 uParam2, UINT64 uParam3,UINT64 uParam4);
/*** 覆盖父类的逻辑处理函数集 ***/
CCustomServerGateUser* CreateGateUser();
VOID DestroyGateUser(CCustomServerGateUser* pUser);
VOID OnOpenUser(CCustomServerGateUser *pGateUser);
VOID OnCloseUser(CCustomServerGateUser *pGateUser);
VOID OnGateClosed();
VOID OnDispatchUserMsg(CCustomServerGateUser *pUser, char* pBuffer, SIZE_T nBufferSize);
VOID OnRun();
//向会话服务器发送登陆消息
void Client2SesionCheckUserPasswd(CDataPacketReader &reader,CLogicGateUser* pGateUser); //校验用户名和密码
//向会话服务器创建账户
void Client2SesionCreateAccount(CDataPacketReader &reader,CLogicGateUser* pGateUser); //创建账户
//向数据服发送的登陆消息
void Client2DBGetActorList(CDataPacketReader &reader,CLogicGateUser* pGateUser); //获取玩家列表
void Client2DbDeleteActor(CDataPacketReader &reader,CLogicGateUser* pGateUser); //删除用户
void Client2DbCreateActor(CDataPacketReader &reader,CLogicGateUser* pGateUser); //创建用户
void Client2DbRandName(CDataPacketReader &reader,CLogicGateUser* pGateUser); //随机名字
void Client2DbCheckSecondPsw(CDataPacketReader &reader,CLogicGateUser* pGateUser);
void Client2DbCreateSecondPsw(CDataPacketReader &reader,CLogicGateUser* pGateUser);
//向db服发请求获取角色列表
void SendDbGetActorList(CLogicGateUser* pGateUser);
//重写母函数的这个函数,在传送的时候,登陆公共服务器的时候断开将导致问题,这里需要统一处理下
virtual VOID KickUserByGlobalSessionId(const int nGlobalSessionId);
//向客户端返回登陆的错误
void ResponseLoginErrorAndCloseUser(CLogicGateUser *pUser,int nErrorCode);
private:
//处理用户列表
VOID ProcessUsers();
VOID AddAllGateUsersToFreeList();
/*
*/
VOID OnUserLogin(CLogicGateUser* pUser,unsigned nAccountID,unsigned nActorID,int nLoginIndex=0);
private:
CLogicServer *m_pLogicServer; //所属逻辑服务器
CLogicGateUser m_GateUsers[MAX_GATE_USER]; //静态的网关用户数组
CBaseList<CLogicGateUser*> m_FreeUserList; //空闲网关用户列表
CBaseList<CDataPacket*> m_vMsgList; //临时用来中转数据内容,数据中是一连串的完整包
DPVECTOR m_vFreeList; //用来存放空闲的数据包
CCSLock m_vFreeListLock;
//CCSLock m_msgLock; //消息的锁
CDataPacket* m_pSendToGatePacket;
CBaseList<CDataPacket *> m_logicProcDataList; //逻辑已经处理过的数据包
CTimer<5000> m_ProcessUserInterval;
//void
unsigned long long m_ullSendPacketSize; // 发送数据包大小
int m_nSendPacketCount; // 发送数据包数量
bool m_bUseBigPacket; // 是否使用大数据包(用于提高网络吞吐量)
//int m_nGateIndex; //网关的编号
public:
/*------------------------
//跨服相关逻辑
-------------------------*/
//用户验证客户端账号(虚假的)--可以发送登录请求了
void SimulateClient2SesionCheckUserPasswd(CDataPacketReader &pack,CLogicGateUser* pLogicGateUser);
};