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

📄 cmpp.h

📁 这只是在移动下载的cmpp协议和一些参考资料
💻 H
📖 第 1 页 / 共 2 页
字号:
//**********************************************************************
//	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;

//**********************************************************************
//	STRUCTURE OF ALL CMPP_MSG.
//**********************************************************************
typedef struct cmpp_pkg {
	CMPP_HEAD	pk_head;

	union {
		CMPP_CONNECT			pk_connect;
		CMPP_CONNECT_RESP		pk_connectresp;

		CMPP_SUBMIT				pk_submit;
		CMPP_SUBMIT_RESP		pk_submitresp;

		CMPP_QUERY				pk_query;
		CMPP_QUERY_RESP			pk_queryresp;

		CMPP_DELIVER			pk_deliver;
		CMPP_DELIVER_RESP		pk_deliverresp;

		CMPP_CANCEL				pk_cancel;
		CMPP_CANCEL_RESP		pk_cancelresp;

		CMPP_ACTIVETEST_RESP	pk_activetestresp;
	} pk_body;
} CMPP_PKG;

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

protected:
	int			m_nSocketTimeout;
	void (*m_LogWrite)(LPCTSTR pchFmt, ...);
	unsigned int m_nSeq;
	char		m_sIsmgId[7];		// 6位的Ismg_Id.
	char		m_sMiscId[5];		// 4位的Miscid.
	unsigned short m_ushMsgidSeq;	// Msgid中用到的流水号.
	unsigned int m_nLinkSeqId;		// Linid的序列号.
	unsigned int m_nSmscSeqId;		// smsc的序列号.

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

	//通过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, \
		unsigned _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 *sLinkId);

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

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

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

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

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

	//发送请求连接应答(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, unsigned _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, unsigned _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 *sLinkId);
	
	//发送删除短信应答(Cancel_Response)包
	int SendCancelResp(TCPSocket* tsClient, unsigned int nSeqId, unsigned int nSuccessId);

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

	unsigned int IncreaseSeqId();

	void	LogHex(CString szpre, char *msgContent, int nSize);

	int		ComposeCmppPkg(cmpp_pkg* cp, char* pchBuf, int nSize);

	int		TracePkg(cmpp_pkg* cp);
	
	unsigned int IncreaseLinkSeqId();

public:		
	// 一些功能函数.

	// 得到当前的日期时间(MMDDhhmmss)
	CString GetDoneTime();

	unsigned _int64	GetMsgid();

	void	GetLinkId(char *sLinkId);

	unsigned int IncreaseSmscSeqId();

	CString ConvertToHex(CString szpre, char *msgContent, int nSize);

public:
	unsigned short IncreaseMsgIdSeq();
	
	unsigned int GetSeqId();
};


//**********************************************************************
//	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;
	CString sSpid;
	int		nVersion;
};

//**********************************************************************
//	STRUCTURE OF CLIENT_PARA.(Verify Client)
//**********************************************************************
//struct client_para {
//	CString	sIcpid;				// 企业代码
//	CString sPwd;				// 口令
//	CString sClientip;			// 暂时不用
//};

//**********************************************************************
//	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;			//单连接时用.
	TCPSocket	m_MoConn;			//双连接或双端口时的MO连接.
	TCPSocket	m_MtConn;			//双连接或双端口时的MT连接.

	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)或双端口(2).
	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();
	
	int ActiveTestMO();

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

	int	Start(char *pchSmgIp, int nSmgPort, char *pchUserName, \
		char *pchUserPwd, unsigned char uchVersion, int nActivtestInterval, \
		void (*OnSmgMsg)(CMPP_SMGTOSP  css), int nConnType, \
		void (*OnLogFile)(LPCTSTR pchFmt, ...) = NULL);

	int Release();

	int Submit(unsigned _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 *sLinkId);

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

	int Cancel(unsigned _int64 nMsgId);

	int ActiveTest();

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

//******************************************************************************************************
//**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);
	bool (*m_AuthClient)(char *pchIcpid, char *pchAuth, unsigned int nTimestamp, \
		char *pchClientAddr, char *pchAuthSmg, char *pchSpId);

	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, CString sSpid, int nVersion);
	bool IsLogined(CString sSpId, SOCKET &hSock);

public:
	CCmppServer();
	virtual ~CCmppServer();

	int Start(char *pchServip, int nServport, void (*OnSpMsg)(CMPP_SPTOSMG  css), \
		void (*OnLogFile)(LPCTSTR pchFmt, ...), bool (*OnAuthClient)(char *pchIcpid, char *pchAuth, unsigned int nTimestamp, char *pchClientAddr, char *pchAuthSmg, char *pchSpId), \
		char *pchIsmgId, char *pchMiscid, int nSocketTimeout);

	void Release();

	
	int Deliver(unsigned _int64 nMsgId, char *pchDestId, char *pchServiceId, \
		unsigned char uchTppid, unsigned char uchTpudhi, unsigned char uchMsgFmt, \
		char *pchSrcTerminalId, unsigned char uchSrcTerminalType, unsigned char uchRegisteredDelivery, \
		unsigned char uchMsgLen, char *pchMsgContent, char *sLinkId);
};

// 一些功能函数.

// 分解Msgid.
CMPP_API void ParseMsgid(unsigned _int64 nMsgId, CString& szDateTime, CString& szIsmgId, int& nMsgidSeq);
// 取子字符串.
CMPP_API CString GetSubStr(void* pchBuf, int nLen);
// 64位整数转换高低顺序.
CMPP_API unsigned _int64 hton64(unsigned _int64 ui64Src);
// 获取当前时间(YYMMDDhhmmss)
CMPP_API CString GetDateTime();

CMPP_API CString Base64Decode(char* sSrcStr, int nLen);
CMPP_API CString Base64Encode(char* sSrcStr, int nLen);

#endif // !defined(AFX_CMPP_H__A4DFA71A_1AAF_4DE6_A299_3A154220E698__INCLUDED_)

⌨️ 快捷键说明

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