Files
mir_server/server/RobotGate/DataProcess.h

205 lines
6.7 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#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);
//发送消息到服务器
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