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

📄 cmpp.h

📁 移动短信api
💻 H
📖 第 1 页 / 共 2 页
字号:
typedef struct cmpp_query {
	char			sTime[8];
	unsigned char	uchQueryType;
	char			sQueryCode[10];
	char			sReserved[8];
} CMPP_QUERY;

//**********************************************************************
//	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 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;

//**********************************************************************
//**处理CMPP3.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);

	//删除短信操作
	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, \
		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);

	//发送查询发送短信状态应答(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);

	//发送活动连接测试应答(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 );
};

//******************************************************************************************************
//**CMPP3.0 CLIENT(SP模块)实现.
//******************************************************************************************************
class CMPP_API CCmppClient:public CCmpp  
{
	friend class CJob;
private:
	TCPSocket	m_socket;
	int			m_nSocketTimeout;
	int			m_nSeq;
	bool		m_fStop;			//停止标志.
	bool		m_fLogined;
	LOGIN_PARAM	lp;
	int			m_RetryInterval;
	bool		m_fAutoResp;
	HANDLE		m_hRecvThread;		//接收线程句柄.
	bool		m_fStarted;

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

	CCriticalSection m_socketCS;
private:
	void (*m_pSmgMsg)(CMPP_SMGTOSP  css);
	
	int Connect();
	
	int Terminate();

	static DWORD WINAPI RecvFunc(LPVOID pParam);
	
	virtual DWORD RecvProc();

	unsigned int IncreaseSeqId();

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

	int	Start(char *pchSmgIp, int nSmgPort, char *pchUserName, \
		char *pchUserPwd, unsigned char uchVersion, \
		void (*OnSmgMsg)(CMPP_SMGTOSP  css)/*, void (*OnMTError)(MTErrorStr mterror)*/);

	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 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);

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

	int Cancel(_int64 nMsgId);

	int DeliverResp(unsigned int nSeqId, _int64 nMsgId, unsigned int nResult);

	int ActiveTest();

	unsigned int GetSeqId();
};

//******************************************************************************************************
//**CMPP3.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 + -