123 lines
3.9 KiB
C
123 lines
3.9 KiB
C
|
|
#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;
|
|||
|
|
};
|