#ifndef _RUNGATE_PROTO_ #define _RUNGATE_PROTO_ #ifndef STDCALL #define STDCALL __stdcall #endif #ifndef SCSTR #define SCSTR static const CHAR* #endif //网关核心版本 #define RUNGATE_KRN_VERSION MAKEFOURCC( 15, 5, 18, 1) //用户接收包缓冲区默认大小 #define SESSION_RECV_BUFSIZE 4096 //用户发送包缓冲区默认大小 #define SESSION_SEND_BUFSIZE 8192 //每用户接收处理队列最长数据大小 #define SESSION_MAX_RECVPROC_SIZE 8192 //用户数据队列处理内存增长单位 #define SESSION_DATAGROW_SIZE 1024 //最大用户数据包序号错误数量 #define SESSION_PACKETERR_MAX 32 //处理服务器数据最大时间 #define RUNGATE_PROCESS_SERVERMSG_LIMIT 32 //32毫秒 //每次向用户发送数据包限制 #define RUNGATE_ONCESENDUSE_LIMIT 2048 //发送检查超时 #define RUNGATE_SENDCHECK_TIMEOUT 300 typedef GATEMSGHDR RUNGATEMSGHDR, *PRUNGATEMSGHDR; //session的通信状态,具体见开发文档的定义 typedef enum tagSessionStatus { enSessionStatusIdle =0, //空闲状态 //enEncryReq =1, //请求服务器的密钥状态 //enEncryAck, //密钥确认阶段 enConn, //连接上 enCommunication, //正常的通信阶段 } SESSIONSTATUS; typedef enum tagSessionCloseReason { enReasonAllSessionClose =1000, //所有的session都要关闭 enReasonIdle =1001, //长时间不活跃 enReasonSenderBuffLarge =1002, //发送缓存太长 enReasonSocketError =1003, //socket错误 enReasonSendSockerError=1004, //发送的时候socket错误 enReasonLargePackLeft =1005, //剩余过量的包 enReasonRecvLargerPack=1006, //所有的session都要关闭 enReasonGM =1007, //GMClose enReasonKeyError =1011, //密钥错误 enSycDataLengthError= 1012, //salt data length error } SESSIONCLOSEREASON; typedef struct tagRunGateDataBuffer { char *lpBuffer; int nSize; int nOffset; }RUNGATEDATABUF, *PRUNGATEDATBUF; typedef struct sockaddr_in SOCKADDRIN, *PSOCKADDRIN; typedef enum tagRunSockASyncAction { aaAccept = 1, //AcceptEx aaRecv, //WSARecv aaSend, //WSASend }RUNSOCKASYNCACTION; #ifdef WIN32 //会话异步接受数据 typedef struct tagRunSockOverlapped { OVERLAPPED Overlapped; WSABUF WSABuf; BYTE btAction; //行为类型 BYTE btReceved[3]; struct tagRunGateUserSession *pUser; //会话指针 }RUNSOCKOVERLAPPED, *PRUNSOCKOVERLAPPED; #endif #define OrderSwap16(A) (((uint16_t)(A) >> 8) | ((uint16_t)(A & 0xFF) << 8)) #define OrderSwap32(A) (OrderSwap16((uint32_t)(A) >> 16) | ((uint32_t)(OrderSwap16(A)) << 16)) #define OrderSwap64(A) (OrderSwap32((uint64_t)(A) >> 32) | ((uint64_t)(OrderSwap32(A)) << 32)); enum class emOpcode : uint8_t { //操作码定义类型 MID = 0x0, //标识一个中间数据包 TXT = 0x1, //标识一个text类型数据包 BIN = 0x2, //标识一个binary类型数据包 //0x3 - 7:保留 CLR = 0x8, //标识一个断开连接类型数据包 PIN = 0x9, //标识一个ping类型数据包 PON = 0xA, //表示一个pong类型数据包 }; //用户会话数据 typedef struct tagRunGateUserSession { SOCKET nSocket; int nIndex; int nServerIdx; SOCKADDRIN SockAddr; int nRecvPacketCount; int nSendPacketCount; WORD wPacketError; BYTE btPacketIdx; bool boSendAvaliable; bool boMarkToClose; //标记为关闭状态 bool boRemoteClosed; //远程方是否关闭,如超时或者主动关闭了客户端 BYTE btRcv2[2]; TICKCOUNT dwConnectTick; TICKCOUNT dwCloseTick; TICKCOUNT dwSendTimeOut; TICKCOUNT dwClientMsgTick; TICKCOUNT dwServerMsgTick; unsigned long long nVerifyIdx; //通信的时候消息验证码 unsigned short nKey; // 服务端KEY RUNGATEDATABUF RecvBuf; //CRITICAL_SECTION SendBufLock; RUNGATEDATABUF SendBuf; #ifdef WIN32 RUNSOCKOVERLAPPED Overlapped; #endif CHAR sLoginAccount[jxSrvDef::ACCOUNT_NAME_BUFF_LENGTH]; CHAR sLoginCharName[jxSrvDef::ACTOR_NAME_BUFF_LENGTH]; //int nSessionId;//登录会话ID char sRecvBuf[SESSION_RECV_BUFSIZE+1];//数据接收缓冲区 BYTE btRcv3[3]; short nSessionSatus; // tagSessionStatus里定义 Encrypt encryptHander; // 加密器 int nTimeStampOffset; // 当前发送队列中已经处理过时间戳的偏移量 unsigned long long ullSvrTimeDiff; // 服务器时间和本地时间差 TICKCOUNT nLastSendPacketTime; // 上一次发包间隔 }RUNGATEUSERSESSION, *PRUNGATEUSERSESSION; #define INIT_SESSION_SEND(s) //InitializeCriticalSection( &(s)->SendBufLock ) #define UNINIT_SESSION_SEND(s) //DeleteCriticalSection( &(s)->SendBufLock ) #define LOCK_SESSION_SEND(s) //EnterCriticalSection( &(s)->SendBufLock ) #define TRYLOCK_SESSION_SEND(s) TRUE//TryEnterCriticalSection( &(s)->SendBufLock ) #define UNLOCK_SESSION_SEND(s) //LeaveCriticalSection( &(s)->SendBufLock ) #endif