157 lines
4.7 KiB
C
157 lines
4.7 KiB
C
#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
|