⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmpp.h

📁 中国移动通信CMPP2.0开发库,其中包括Demo和Lib库,Demo中有客户端和服务器的代码
💻 H
📖 第 1 页 / 共 2 页
字号:

//**********************************************************************
//	STRUCTURE OF CMPP_QUERY_RESP.
//**********************************************************************
typedef struct cmpp_query_resp {
	char			sTime[8];
	unsigned char	uchQueryType;
	char			sQueryCode[10];
	unsigned int	nMTTLMsg;		//从SP接收消息总数.
	unsigned int	nMTTLUsr;		//从SP接收用户总数.
	unsigned int	nMTScs;			//成功转发数量.
	unsigned int	nMTWT;			//待转发数量.
	unsigned int	nMTFL;			//转发失败数量.
	unsigned int	nMOScs;			//向SP成功送达数量.
	unsigned int	nMOWT;			//向SP待送达数量.
	unsigned int	nMOFL;			//向SP送达失败数量.
} CMPP_QUERY_RESP;

//**********************************************************************
//	STRUCTURE OF CMPP_CANCEL.
//**********************************************************************
typedef struct cmpp_cancel {
	_int64			nMsgid;
} CMPP_CANCEL;

//**********************************************************************
//	STRUCTURE OF CMPP_CANCEL_RESP.
//**********************************************************************
typedef struct cmpp_cancel_resp {
	unsigned char	uchSuccessId;
//	unsigned int	nSuccessId;
} CMPP_CANCEL_RESP;

//**********************************************************************
//	STRUCTURE OF CMPP_ACTIVETEST_RESP.
//**********************************************************************
typedef struct cmpp_activetest_resp {
	unsigned char	uchReserved;
} CMPP_ACTIVETEST_RESP;

//**********************************************************************
//	STRUCTURE OF CMPP_SMG_TO_SP.
//**********************************************************************
typedef struct cmpp_smgtosp {
	CMPP_HEAD	pk_head;

	union {
		CMPP_CONNECT_RESP		pk_connectresp;
		CMPP_SUBMIT_RESP		pk_submitresp;
		CMPP_QUERY_RESP			pk_queryresp;
		CMPP_DELIVER			pk_deliver;
		CMPP_CANCEL_RESP		pk_cancelresp;
		CMPP_ACTIVETEST_RESP	pk_activetestresp;
	} pk_body;
} CMPP_SMGTOSP;

//**********************************************************************
//	STRUCTURE OF CMPP_SP_TO_SMG.
//**********************************************************************
typedef struct cmpp_sptosmg {
	CMPP_HEAD	pk_head;

	union {
		CMPP_CONNECT			pk_connect;
		CMPP_SUBMIT				pk_submit;
		CMPP_QUERY				pk_query;
		CMPP_DELIVER_RESP		pk_deliverresp;
		CMPP_CANCEL				pk_cancel;
		CMPP_ACTIVETEST_RESP	pk_activetestresp;
	} pk_body;
} CMPP_SPTOSMG;

//**********************************************************************
//**处理CMPP2.0基本命令的类**
//**********************************************************************
class CMPP_API CCmpp  
{
public:
	CCmpp();
	virtual ~CCmpp();

protected:
	int			m_nSocketTimeout;
protected:
	//接收SMG方面的所有消息
	int RecvSmgMsg(TCPSocket* tsClient, cmpp_smgtosp* css);

	//通过MD5算法构造登录请求包.
	void m_SetConnPkg(CMPP_CONNECT *cl, const char *pchSrcAddr, \
		const char *pchPwd, unsigned char uchVersion);

	//建立连接操作(Connect)
	int SendConnect(TCPSocket* tsClient, unsigned int nSeqId, char* pchSrcAddr, char* pchPwd, unsigned char uchVersion);

	//拆除连接操作Terminate)
	int SendTerminate(TCPSocket* tsClient, unsigned int nSeqId);

	//提交短信操作(Submit)
	int SendSubmit(TCPSocket* tsClient, unsigned int nSeqId, \
		_int64 nMsgId, unsigned char uchPKtotal, unsigned char uchPKnumber, \
		unsigned char uchNeedreport, unsigned char uchMsglevel, char *pchServiceid, \
		unsigned char uchFeeusertype, char *pchFeeterminalid,/* unsigned char uchFeeterminaltype,*/ \
		unsigned char uchTppid, unsigned char uchTpudhi, unsigned char uchMsgfmt, \
		char *pchMsgsrc, char *pchFeetype, char *pchFeecode, char *pchValidtime, char *pchAttime, \
		char *pchSrcid, unsigned char uchDestusrtl, char *pchDestterminalid, /*unsigned char uchDestterminaltype,*/ \
		unsigned char uchMsglen, char *pchMsgcontent/*, char *pchLinkid*/);

	//查询发送短信状态(Query)
	int SendQuery(TCPSocket* tsClient, unsigned int nSeqId, char* pchTime, \
		unsigned char uchQueryType, char* pchQueryCode);

	//送交短信应答(Deliver_Resp)
	int SendDeliverResp(TCPSocket* tsClient, unsigned int nSeqId, _int64 nMsgId, /*unsigned int nResult*/unsigned char uchResult);

	//删除短信操作
	int SendCancel(TCPSocket* tsClient, unsigned int nSeqId, _int64 nMsgId);

	//连接活动测试
	int SendActiveTest(TCPSocket* tsClient, unsigned int nSeqId);

	//接收cmppclient(sp)方面的消息
	int RecvSpMsg(TCPSocket* tsClient, cmpp_sptosmg* css);

	//发送请求连接应答(Connect_Response)包
	int SendConnectResp(TCPSocket* tsClient, unsigned int nSeqId,/* unsigned int nStatus*/unsigned char uchStatus, \
		char *pchAuthSMG, unsigned char uchVersion);

	//发送拆除连接应答(Terminate_Response)包
	int SendTerminateResp(TCPSocket* tsClient, unsigned int nSeqId);

	//发送提交短信应答(Submit_Response)包
	int SendSubmitResp(TCPSocket* tsClient, unsigned int nSeqId, _int64 nMsgId, \
		/*unsigned int nResult*/unsigned char uchResult);

	//发送查询发送短信状态应答(Query_Response)包
	int SendQueryResp(TCPSocket* tsClient, unsigned int nSeqId, char* pchTime, \
		unsigned char uchQueryType, char* pchQueryCode, \
		unsigned int nMTTLMsg, unsigned int nMTTLUsr, \
		unsigned int nMTScs, unsigned int nMTWT, \
		unsigned int nMTFL, unsigned int nMOScs, \
		unsigned int nMOWT, unsigned int nMOFL);

	//发送送交消息(Deliver)包
	int SendDeliver(TCPSocket* tsClient, unsigned int nSeqId, _int64 nMsgId, char *pchDestId, char *pchServiceId, \
		unsigned char uchPid, unsigned char uchUdhi, unsigned char uchMsgFmt, \
		char *pchSrcTerminalId, /*unsigned char uchSrcTerminalType,*/ unsigned char uchRegisteredDelivery, \
		unsigned char uchMsgLen, char *pchMsgContent/*, char *pchLinkId*/);
	
	//发送删除短信应答(Cancel_Response)包
	int SendCancelResp(TCPSocket* tsClient, unsigned int nSeqId, /*unsigned int nSuccessId*/unsigned char uchSuccessId);

	//发送活动连接测试应答(Active_Test_Response)包
	int SendActiveTestResp(TCPSocket* tsClient, unsigned int nSeqId);
};


//**********************************************************************
//	STRUCTURE OF LOGIN_PARAM.
//**********************************************************************
typedef struct login_param {
	char	sSmgIp[16];				//短信网关的IP地址.
	unsigned short ushPort;			//短信网关的端口号.
	char	sLoginName[7];			//SP_ID,sp的企业代码.
	char	sLoginPwd[MAX_PATH];	//SP的登录口令,最长20位.
	unsigned char	uchVersion;
} LOGIN_PARAM;

//**********************************************************************
//	STRUCTURE OF CLIENT_CONN.
//**********************************************************************
struct client_conn {
	SOCKET	hClient;
	CString sIcpid;
};

//**********************************************************************
//	STRUCTURE OF SRVTHREAD_PARAM.
//**********************************************************************
struct srvthread_param {
	CCmppServer* csServer;
	TCPSocket*	tsClient;
};

//
//用于处理消息和事件的线程池
//
class CJob:public IJobDesc {
public:
	CJob(CMPP_SMGTOSP css, CCmppClient* cmppclient);
	CJob(CMPP_SPTOSMG css, CCmppServer* cmppserv);
	~CJob();

	void	OnSmgMsg();
	void	OnSpMsg();
	int		nType;		//0:message(smgmsg) 1:message(spmsg)
private:
	CCmppClient*	m_cmppclient;
	CCmppServer*	m_cmppserv;
	CMPP_SMGTOSP	m_smgmsg;
	CMPP_SPTOSMG	m_spmsg;
};

class CWorker:public IWorker {
	virtual void ProcessJob( IJobDesc* pJobDesc );
};

//******************************************************************************************************
//**CMPP2.0 CLIENT(SP模块)实现.
//******************************************************************************************************
class CMPP_API CCmppClient:public CCmpp  
{
	friend class CJob;
private:
	TCPSocket	m_socket;			//单连接时用.
	TCPSocket	m_MoConn;			//双连接或双端口时的MO连接.
	TCPSocket	m_MtConn;			//双连接或双端口时的MT连接.

	int			m_nSocketTimeout;
	int			m_nSeq;
	bool		m_fStop;			//停止标志.
	bool		m_fLogined;
	
	bool		m_fMTLogined;
	bool		m_fMOLogined;

	LOGIN_PARAM	lp;
	int			m_RetryInterval;
	bool		m_fAutoResp;
	HANDLE		m_hRecvThread;		//接收线程句柄.
	HANDLE		m_hRecvMoThread;	//接收MO消息线程的句柄.
	bool		m_fStarted;

	CThreadPool	m_pool;				//执行各种消息处理函数的线程池.
	CWorker		m_worker;
	CJob		*m_pJob;

	CCriticalSection m_socketCS;

	int			m_nSmgType;			//网关类型,如适用于单连接(0),双连接(1)或双端口(1).
	unsigned short m_ushMoport;		//双端口时的MO Port.
	unsigned short m_ushMtport;		//双端口时的MT Port.
private:
	void (*m_pSmgMsg)(CMPP_SMGTOSP  css);
	
	int Connect_Single();			//单连接的登录过程
	int Connect_MT();
	int Connect_MO();
	int Connect_Double();			//双连接或双端口的登录过程

	int Connect();
	
	int Terminate();

	//用于接收MO消息.
	static DWORD WINAPI RecvMoFunc(LPVOID pParam);
	
	virtual DWORD RecvMoProc();

	//用于接收MT的回复消息.(双连接的时候)
	static DWORD WINAPI RecvMtFunc(LPVOID pParam);
	
	virtual DWORD RecvMtProc();
	
	unsigned int IncreaseSeqId();

	int ActiveTestMO();

	int ActiveTestMT();
public:
	CCmppClient();
	virtual ~CCmppClient();

	int	Start(char *pchSmgIp, int nSmgPort, char *pchUserName, \
		char *pchUserPwd, unsigned char uchVersion, \
		void (*OnSmgMsg)(CMPP_SMGTOSP  css), int nConnType = 0/*默认单连接*/);

	int Release();

	int Submit(_int64 nMsgId, unsigned char uchPKtotal, unsigned char uchPKnumber, \
		unsigned char uchNeedreport, unsigned char uchMsglevel, char *pchServiceid, \
		unsigned char uchFeeusertype, char *pchFeeterminalid, unsigned char uchTppid, \
		unsigned char uchTpudhi, unsigned char uchMsgfmt, char *pchMsgsrc, \
		char *pchFeetype, char *pchFeecode, char *pchValidtime, \
		char *pchAttime, char *pchSrcid, unsigned char uchDestusrtl, \
		char *pchDestterminalid, unsigned char uchMsglen, char *pchMsgcontent);

	int Query(char* pchTime, unsigned char uchQueryType, char* pchQueryCode = NULL);

	int Cancel(_int64 nMsgId);

//	int DeliverResp(unsigned int nSeqId, _int64 nMsgId, /*unsigned int nResult*/unsigned char uchResult);

	int ActiveTest();

	unsigned int GetSeqId();
	
	//用于设置双端口连接时的端口号.
	void SetDoublePort(unsigned short ushMoport, unsigned short ushMtport);
};

//******************************************************************************************************
//**CMPP2.0 SERVER(模拟网关部分)的实现.
//******************************************************************************************************
class CMPP_API CCmppServer:public CCmpp {
	friend class CJob;
	//member varibals
private:
	TCPSocket	m_TsServer;
	int			m_nLocalPort;
	char		m_sLocalAddr[16];
	bool		m_fStop;
	int			m_nSocketTimeout;
	client_conn	conn_list[255];
	int			m_nConnectTotal;
	HANDLE		m_hThread;			//本地监听线程的句柄
	BOOL		m_fStarted;

	void (*m_pSpMsg)(CMPP_SPTOSMG  css);
	CThreadPool	m_pool;				//执行各种消息处理函数的线程池.
	CWorker		m_worker;
	CJob		*m_pJob;
	//member functions
protected:
	int LocalListen();

	static DWORD WINAPI CmppServFunc(LPVOID pParam);
	virtual DWORD CmppServProc();

	static DWORD WINAPI CmppClientFunc(LPVOID pParam);
	virtual DWORD CmppClientProc(TCPSocket* tsClient);

	SOCKET GetFromList(CString sIcpid);
	void RemoveFromList(SOCKET hClient);
	void AddToList(SOCKET hClient, CString sIcpid);

	char* GetSubStr(char* pchBuf, int nLen, int nStart = 0);
public:
	CCmppServer();
	virtual ~CCmppServer();

	int Start(void (*OnSpMsg)(CMPP_SPTOSMG  css));
	void Release();
};

#endif // !defined(AFX_CMPP_H__A4DFA71A_1AAF_4DE6_A299_3A154220E698__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -