274 lines
8.1 KiB
C
274 lines
8.1 KiB
C
|
|
#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);
|
|||
|
|
};
|