Files
mir_server/server/GateServer/DataProcess.h
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

208 lines
6.8 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef _DATAPROCESS_H_
#define _DATAPROCESS_H_
#define RUNDATA_MAX_SENDTHREAD 8
#define MAX_SEND_BUFF_SIZE 8192 //最大的发送缓从的大小
class CRunDataProcesser;
using namespace wylib::container;
//数据发送线程
typedef struct tagRunDataSendThread
{
#ifdef _MSC_VER
HANDLE hThread;
#else
pthread_t hThread;
#endif
int nThreadIdx;
DWORD dwThreadId;
TICKCOUNT dwProcTick;
TICKCOUNT dwSleepTick;
bool boSendEWouldBlock;
bool boSendFewBuffer;
BYTE btRcvs[2];
CRunDataProcesser *pRunData;
CRITICAL_SECTION SendQueueLock;
CBaseList<LPVOID> *pSendAppendList;
CBaseList<LPVOID> *pSendProcList;
}RUNDATASENDTHREAD, *PRUNDATASENDTHREAD;
//网关数据处理类型
typedef enum tagDataProcesserType
{
dp_Default = 0,
dp_GameEngine = 1
}DATAPROCESSERTYPE;
class CRunSockProcesser;
class CRunDataProcesser : public CCustomGateClient
//: public CCustomClientSocket
{
public:
//typedef CCustomClientSocket Inherited;
typedef CCustomGateClient Inherited;
static int s_nIgnoreDataPacket;
private:
typedef struct tagClientRecvBuf
{
PRUNGATEUSERSESSION pSession;
int nBufferSize;
ULONG_PTR nVerify;
}CLIENTRECVBUF, *PCLIENTRECVBUF,
SENDCLIENTBUF, *PSENDCLIENTBUF;
static const int SIZE_OPENUSER = -1;
static const int SIZE_CLOSEUSER = -2;
private:
int m_nActiveUser; //活动连接数
BOOL m_boStoping; //是否正在停止服务
BOOL m_boStarted; //是否已经启动服务
//HANDLE m_hPipe; //与服务器通信管道
//CHAR m_sPipeName[MAX_PATH]; //管道名称
CHAR m_sGateName[64]; //网关名称
int m_nSendThreadCount; //发送线程数量
DATAPROCESSERTYPE m_DataProcessType;
#ifdef _MSC_VER
HANDLE m_hProcRecvThread;
#else
pthread_t m_hProcRecvThread;
#endif
RUNDATASENDTHREAD m_SendThreads[RUNDATA_MAX_SENDTHREAD];
RTL_CRITICAL_SECTION m_SessionLock;
int m_nMaxSessionCount;
PRUNGATEUSERSESSION m_Sessions; //用户会话队列
RTL_CRITICAL_SECTION m_RecvQueueLock;
CBaseList<LPVOID> m_RecvQueue[2];
CBaseList<LPVOID> *m_pRecvAppendList;
CBaseList<LPVOID> *m_pRecvProcList;
RUNGATEDATABUF m_ServerBuf;
long long m_nUserVerify;
BOOL m_boPrintC2SMsg;//是否打印客户端向服务器发送的数据包
BOOL m_boPrintS2CMsg;//是否打印服务器向客户端发送的数据包
//CCustomClientSocket m_pServerRcvSocket; //接受服务器的数据的socket
//CNetworkDataHandler m_DataPacker; //数据接包器
CRunSockProcesser* m_pSockProcesser; // Sock用户处理
int m_nCheckTimeCount;
long long m_llOccuTimeDiff;
long long m_llSvrTimeDiff; // 服务器与本客户端的时间差
long long m_llSendKeepAliveTime; // 网关发送心跳包给服务器的时间
#ifdef _MSC_VER
static VOID STDCALL RecvDataProcessRoutine(void *pRunData);
static VOID STDCALL SendDataProcessRoutine(void *pRunThread);
//static VOID STDCALL RecvServerProcessRoutine(void *pRunData);
#else
static VOID* RecvDataProcessRoutine(void *pRunData);
static VOID* SendDataProcessRoutine(void *pRunThread);
//static VOID* RecvServerProcessRoutine(void *pRunData);
#endif
VOID InitSessions();
VOID UninitSessions();
VOID FreeRecvBuffers();
VOID FreeSendBuffers(PRUNDATASENDTHREAD pSendThread);
BOOL CopyWaitSendBuffers(PRUNDATASENDTHREAD pSendThread, BOOL boForceCopy);
protected:
VOID GetSessionLoginInfo(PRUNGATEUSERSESSION pSession, char *sBuffer, int nBufferSize);
protected:
VOID GotError(LPCSTR sErrFn, LPCSTR sErrApi, int nErr);
VOID InitSendThreadData();
VOID UninitSendThreadData();
VOID SendCheck(int nIdent);
VOID SendGateUserInfo();
public:
VOID SendOpenSession(PRUNGATEUSERSESSION pSession);
VOID SendCloseSession(PRUNGATEUSERSESSION pSession, BOOL boCloseOnServer = TRUE, INT nReason = 0);
protected:
VOID SendKeepAliveAck(PRUNGATEUSERSESSION pSession, const char *pBuffer, SIZE_T nBufSize);
VOID CloseAllSessions(BOOL boForceClose);
VOID CancelRemainSendSessionBuffers();
BOOL CheckCloseSessions(BOOL boForceCheck);
VOID CheckSendSessionBuffers(PRUNDATASENDTHREAD pSendThread);
//websocket握手
VOID ShakeHandsHandle(PRUNGATEUSERSESSION pSession, char* pBuffer, int BufferSize);
//发送消息到服务器
VOID SendServerMessage(int nIdent, int nSessionIdx, SOCKET nSocket, int nServerIdx, char *pBuffer, int nBufSize);
//发送数据到客户端
VOID PostUserServerData(PRUNGATEUSERSESSION pSession, const char *pBuffer, int nBufferSize, BOOL boWriteWsHdr=TRUE, BOOL boWriteProtoHdr=FALSE, TICKCOUNT nSendTime = 0);
//处理客户端发过来的数据
VOID ProcessUserRecvPacket(PRUNGATEUSERSESSION pSession, char *pBuffer, int nBufferSize);
//重载CustomWorkSocket的函数,处理服务器的数据数据,将调用ProcessServerPacket
virtual void ProcessRecvBuffers(const GATEMSGHDR* pHeader, LPCSTR pData, size_t nLen);
VOID DispathRecvMessage(const PGATEMSGHDR pMsgHdr, const char *pBuffer, SIZE_T nBufSize);
VOID OnConnected();
virtual VOID OnClosed();
VOID OnError(INT errorCode);
VOID OnDisconnected();
public:
CRunDataProcesser(const int nMaxSessionCount);
~CRunDataProcesser();
SIZE_T m_dwProcessRecvSize; //处理客户端接收数据大小
SIZE_T m_dwWaitSendUserSize; //待发送给用户的数据包大小
SIZE_T m_dwWaitSendQueueSize; //待发给用户的数据包队列大小
SIZE_T m_dwRecvSeverSize; //接收服务器数据大小
SIZE_T m_dwSendUserSize; //发送用户数据大小
TICKCOUNT m_dwLastProcUsrMsgTime; //上次处理用户数据时间
TICKCOUNT m_dwLastProcSrvMsgTime; //上次处理服务器数据时间
TICKCOUNT m_dwLastRecvSrvMsgTime; //上次接收服务器数据时间
TICKCOUNT m_dwProcSrvThreadSleep; //处理服务器数据线程休眠时间
SIZE_T m_dwSendQueueSize; //待发数据队列数据包大小
INT GetActiveUserCount();
inline LPCSTR GetName(){ return m_sGateName; }
VOID SetName(LPCSTR sName);
//VOID SetPipeName(LPCSTR sPipeName);
INT GetSendThreadCount();
VOID SetSendThreadCount(INT ThreadCount);
DATAPROCESSERTYPE GetDataProcessType();
VOID SetDataProcessType(DATAPROCESSERTYPE Type);
INT GetMaxSessionCount();
VOID SetRunSockProcesser(CRunSockProcesser* pSockProcesser);
CRunSockProcesser* GetRunSockProcesser() const { return m_pSockProcesser; }
PRUNDATASENDTHREAD GetSendThreadInfo(INT ThreadIdx);
PRUNGATEUSERSESSION GetFirstSession();
VOID SetPrintC2SMessage(const BOOL boPrint);
VOID SetPrintS2CMessage(const BOOL boPrint);
BOOL Startup();
VOID Stop();
PRUNGATEUSERSESSION NewSession(SOCKET nSocket, SOCKADDRIN RemoteAddr);
VOID AddRecvBuf(PRUNGATEUSERSESSION pSession, unsigned long long nVerify, char *pBuffer, int BufferSize);
static VOID ShowGateStatus(CRunDataProcesser *pRunData);
static int ChangeConsoleLine(int nLine, int nPos, LPCSTR sFormat, ...);
static unsigned int s_nSndThreadSleepTime; // 发送线程Sleep时间毫秒为单位
};
#endif