Files
mir_server/server/AmServer/AMClientSocket.h

123 lines
3.9 KiB
C
Raw Permalink Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
/*
typedef enum tagAMServerMsg
{
AMC_REGIST = 10000, //注册
AMC_QUERY_AMOUNT = 10001, //查询用户余额
AMC_COMSUME = 10002, //发送用户消费请求
AMS_QUERY_AMOUNT = 20001, //返回用户余额
AMS_COMSUME = 20002, //返回用户消费结果
AMS_PAY_SUCCED = 20003, //返回充值成功
};
*/
typedef struct tagTASKReq
{
int Socket;
int Serverid;
int Cmdid;
int Contractid;
int Step;
bool operator==(const tagTASKReq& a)const
{
if(Serverid == a.Serverid && Cmdid == a.Cmdid && Contractid == a.Contractid && Step == a.Step)
return true;
else
return false;
}
}TASKREQ, *PTASKREQ;
typedef std::vector<TASKREQ> TASKREQ_Vec;
typedef std::map<UINT, TASKREQ_Vec > TASKREQ_Map;
typedef enum tagAMErrorNumber
{
ERROR_NOT_CONNECT_DB = -100, //无法连接数据库
ERROR_QUERY_DB = -101, //查询数据库错误
ERROR_NOT_REGDIST = -102, //未注册
ERROR_NOTFIND_PRODUCT = -103, //无法找到对应的产品
};
class CCustomJXServerClientSocket;
class CAMServerSocket;
class CProduct;
class CAMClientSocket:
protected CCustomServerClientSocket
{
public:
typedef CCustomServerClientSocket Inherited;
CAMClientSocket(void);
CAMClientSocket(CAMServerSocket* pSrv,SOCKET nSocket, SOCKADDR_IN *pClientAddr);
~CAMClientSocket(void);
char * GetSpid() {return m_Spid;}
void SendPaySucceed(int nServerIndex,UINT uUserId,UINT nActorId, UINT uMoney);
void AskTaskSituation(int nserverid, UINT uUserId, UINT cmdid, int contractid, int step );
void AddTaskMsg(SOCKET nsocket, int nserverid, UINT uUserId, UINT cmdid, int contractid, int step );
/* 返回true存在这个msg并删除返回false没有这个msg */
bool DelTaskMsg(SOCKET nsocket, int nserverid, UINT uUserId, UINT cmdid, int contractid, int step );
protected:
virtual VOID OnDispatchRecvPacket(const jxSrvDef::INTERSRVCMD nCmd, CDataPacketReader &inPacket);
virtual bool OnValidateRegData(const jxSrvDef::PSERVER_REGDATA pRegData);
virtual VOID OnRun();
//按通信协议申请一份发送数据包nCmd是通信消息号
//数据包填充完毕后需要调用flushProtoPacket提交到发送队列
CDataPacket& allocProtoPacket(const jxSrvDef::INTERSRVCMD nCmd);
//提交发送数据包到发送缓冲,会自动计算数据长度并向数据包的通信协议头部分写入长度值
VOID flushProtoPacket(CDataPacket& packet);
VOID SendKeepAlive();
/* 覆盖父类的网络数据包处理函数以便实现通信协议的数据包解析 */
VOID ProcessRecvBuffers(PDATABUFFER pDataBuffer);
private:
void AddMessage(jxSrvDef::INTERSRVCMD nCmd, CDataPacketReader& packet);
CDataPacket* AllocPacket();
void FreePacket(CDataPacket* packet);
void DestroyPacketList(CQueueList<CDataPacket*>& pkgList);
void HandleAMMessage(jxSrvDef::INTERSRVCMD nCmd, CDataPacket &packet);
int GetErrorNo();
void RegistClient(CDataPacket &packet);
void QueryAmount(CDataPacket &packet);
void Consume(CDataPacket &packet);
LPCSTR GetResultCode(int op);
void SendResponse(SOCKET nsocket, LPCSTR sContent);
void SendTaskSituation(CDataPacket &packet);
//获取连接的服务器名称
inline LPCSTR getClientName(){ return m_sClientName; }
private:
//char buff[1024];
char m_gName[10]; //游戏英文缩写
char m_Spid[10]; //运营商英文缩写
CQueueList<CDataPacket*> m_sMsgList;
CCSLock m_sMsgListLock;
CQueueList<CDataPacket*> m_sFreeList;
CCSLock m_sFreeListLock;
//CSQLConenction m_Mysql;
CAMServerSocket* m_pSrv;
CProduct * m_Product;
bool m_IsRegist;
unsigned int m_nClientSrvIdx; //客户端的服务器ID
char m_sClientName[64]; //客户端注册的服务器名称
jxSrvDef::SERVERTYPE m_eClientType; //客户端注册的服务器类型
int m_boRegisted; //客户端是否已经注册连接
TASKREQ_Map m_TaskMap;
RTL_CRITICAL_SECTION m_TaskMsgVecLock;
};