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

📄 cmpp.h

📁 中国移动通信CMPP3.0短消息网关开发接口库内附中国移动通信CMPP3.0短消息网关开发接口使用手册
💻 H
📖 第 1 页 / 共 2 页
字号:
//*******************************************************************************
//
//	文件名:	Cmpp.h
//	描述:
//			中国移动通信互联网短信网关接口协议(China Mobile Point to Point)实现.
//	版本:	3.1.1.0
//	作者:	PrinceToad(欢迎与我联系:princetoad@126.com)
//	日期:	2003-2004
//	介绍:
//			1.能够自动适应以下网关类型:标准cmpp类型(单连接,如华为,思特奇,标准东软),
//			双连接类型(MO,MT分连接进行,通过登录包的Version字段区分,如亚信(ASIA)),
//			双端口类型(MO,MT连接不同的网关端口,通过端口号区分,如清华声讯(TSSX))
//			2.效率高,稳定性强.
//			3.支持CONNECT, SUBMIT, DELIVER, QUERY, CANCEL, TERMINATE, ACTIVETEST消息.
//			4.支持对客户端的鉴权,支持IP地址绑定鉴权.
//			5.支持状态报告,自动生成MsgId和LinkID.
//			6.提供一系列功能函数,如对MsgId的分解ParseMsgId().
//
//			免费提供SP短消息网关开发接口库下载使用(CMPP2.0, CMPP3.0, SGIP1.2),
//			免费提供技术支持!
//			
//			2004.1.10,本接口库首批通过北京移动亚信CMPP3.0,卓望DSMP测试!!
//
//			Http://princetoad.xiloo.com.
//			SourceCode On Sale!
//
//*******************************************************************************
#ifndef CMPP_30_H
#define CMPP_30_H

#include "stdafx.h"
#include <winsock2.h>
#pragma comment(lib, "ws2_32")
#pragma pack(1)

#include "md5.h"
#include <afxmt.h>			//CCriticalSection
#include <afxtempl.h>		//CMap, CList

#ifdef CMPP_IMPORT
#define	CMPP_API __declspec(dllimport)
#else
#define	CMPP_API __declspec(dllexport)
#endif

#define SOCKET_TIMEOUT	5
#define SOCKET_CLOSED	-1

//Error Code
#define CMPP_UNLOGOIN	1		//客户端没有登录.

//#define PRINTOUT	TRACE
#define PRINTOUT	printf
//#define PRINTOUT	LogWrite
//网关类型
#define SINGLE_CONN		0
#define DOUBLE_CONN		1
#define DOUBLE_PORT		2

#define	ASIA_MT			0x00
#define	ASIA_MO			0x01

#define NEED_SREPORT	1
#define NO_SREPORT		0
#define IS_SREPORT		1
#define NOT_SREPORT		0

class CCmppClient;
class CCmppServer;

//**********************************************************************
//**处理字符流的类**
//**********************************************************************
class CBuffer {
public:
	CBuffer() {
		// 申请一段空间,1024对于cmpp来说足够了.
		m_str = new char[1024];
		ZeroMemory(m_str, 1024);
		m_nLen = 0;
	}

	~CBuffer() {
		//释放空间.
		delete[] m_str;
		m_str = NULL;
	}
	
	//返回指向buffer的指针.
	char* GetBuffer() {
		return m_str;
	}
	
	//返回buffer的有效长度.
	int GetBufLen() {
		return m_nLen;
	}
	
	//设置buffer的内容,n1=TotalLength, n2=CommandID, n3=SeqID, pchData=MsgBody, nLen=sizeof(MsgBody).
	void SetBuffer(int nStart, int n1, int n2, int n3, void* pvData = NULL, int nLen = 0) {
		CopyMemory(m_str+nStart, &n1, 4);
		CopyMemory(m_str+nStart+4, &n2, 4);
		CopyMemory(m_str+nStart+8, &n3, 4);
		if (pvData != NULL) {
			CopyMemory(m_str+nStart+12, pvData, nLen);
		}
		m_nLen = nStart+12+nLen;
	}

	//增加一段内容.
	void Add(void* pvData, int nLen) {
		//增加了对pvData是否为空的判断.
//		if (pvData != NULL) {
		if (AfxIsValidAddress(pvData, nLen, FALSE)) {
			CopyMemory(m_str+m_nLen, pvData, nLen);
		}

		m_nLen += nLen;
	}
private:
	char *m_str;
	int	m_nLen;		//当前buffer的长度.
};

//**********************************************************************
//**封装了Winsock API的类**
//**********************************************************************
class CMPP_API TCPSocket  
{
public:
	SOCKET m_hSocket;

	CString m_szClientAddr;

	TCPSocket();
	
	TCPSocket(SOCKET sock);

	~TCPSocket();

	int Cleanup();

	int Create(int nType = SOCK_STREAM);

	int Close();

	int Bind(const unsigned short ushPort, const char* pchIP = NULL);

	int Listen(int nMaxConn = SOMAXCONN);

	int Connect(const char* pchIP, const unsigned short ushPort);

	int Accept(TCPSocket* tsClient);

	int Send(const char *pch, const int nSize, const int nSecs);

	int Receive(char* pch, const int nSize, const int nSecs);

	operator SOCKET() {
		return m_hSocket;
	}
};

//**********************************************************************
//**下面是线程池相关的类**
//**********************************************************************
struct IJobDesc
{
};

struct IWorker
{
	virtual void ProcessJob(IJobDesc* pJob)=0;
};


struct ThreadInfo
{
	DWORD m_pThreadId;
	HANDLE m_hThread;
	bool	m_bBusyWorking;
	ThreadInfo() { m_hThread=0; m_bBusyWorking=false; }
	ThreadInfo(HANDLE handle, bool bBusy) { m_hThread=handle; m_bBusyWorking=bBusy; }
	ThreadInfo(const ThreadInfo& info) { m_hThread=info.m_hThread; m_bBusyWorking=info.m_bBusyWorking; }
};


class CThreadPool  
{
	friend static unsigned int CThreadPool::ManagerProc(void* p); 
	friend static unsigned int CThreadPool::WorkerProc(void* p);
protected:
	enum ThreadPoolStatus { BUSY, IDLE, NORMAL };
public:
	//interface to the outside
	void Start(unsigned short nStatic, unsigned short nmax);
	void Stop(bool bHash=false);
	void ProcessJob(IJobDesc* pJob, IWorker* pWorker) const;
	
	//constructor and destructor
	CThreadPool();
	virtual ~CThreadPool();
	
protected:
	//interfaces public:
	HANDLE GetMgrIoPort() const { return m_hMgrIoPort; }
	UINT GetMgrWaitTime() const { return 1000*60; } //1 minute
	HANDLE GetWorkerIoPort() const { return m_hWorkerIoPort; }
	
private:
	static unsigned int ManagerProc(void* p);
	static unsigned int WorkerProc(void* p);
protected:
	//manager thread
	HANDLE m_hMgrThread;
	HANDLE m_hMgrIoPort;
protected:
	//configuration parameters
	mutable UINT m_nNumberOfStaticThreads;
	mutable UINT m_nNumberOfTotalThreads;
	
protected:
	//helper functions
	void AddThreads();
	void RemoveThreads();
	ThreadPoolStatus GetThreadPoolStatus();
	void ChangeStatus(DWORD threadId, bool status);
	void RemoveThread(DWORD threadId)
	{
		CSingleLock lock(&m_arrayCs);
		lock.Lock();
		m_threadMap.RemoveKey(threadId);
		lock.Unlock();
	}
	
protected:
	//all the work threads
	CMap<DWORD, DWORD&, ThreadInfo, ThreadInfo&> m_threadMap;
	CCriticalSection m_arrayCs;
	HANDLE m_hWorkerIoPort;
};

//
//定义Cmpp3.0 消息结构.
//
//**********************************************************************
//	STRUCTURE OF CMPP_HEAD.
//**********************************************************************
typedef struct cmpp_head {
	unsigned int	nTotalLength;
	unsigned int	nCommandId;
	unsigned int	nSeqId;
} CMPP_HEAD, CMPP_TERMINATE, CMPP_TERMINATE_RESP, CMPP_ACTIVETEST;
;

//**********************************************************************
//	STRUCTURE OF CMPP_CONNECT.
//**********************************************************************
typedef struct cmpp_connect {
	char			sSourceAddr[6];
	char			sAuthSource[16];
	unsigned char	cVersion;
	unsigned int	nTimeStamp;
} CMPP_CONNECT;

//**********************************************************************
//	STRUCTURE OF CMPP_CONNECT_RESP.
//**********************************************************************
typedef struct cmpp_connect_resp {
	//unsigned char	uchStatus;
	unsigned int	nStatus;
	char			sAuthISMG[16];
	unsigned char	cVersion;
} CMPP_CONNECT_RESP;

//**********************************************************************
//	STRUCTURE OF CMPP_SUBMIT_DELIVER_RESP.
//**********************************************************************
typedef struct cmpp_submit_deliver_resp {
	unsigned _int64			nMsgid;
	//unsigned char	uchResult;
	unsigned int	nResult;
} CMPP_SUBMIT_RESP, CMPP_DELIVER_RESP;

//**********************************************************************
//	STRUCTURE OF CMPP_DELIVER_StatusReport.
//**********************************************************************
typedef struct cmpp_status_report {
	unsigned _int64	nMsgid;
	char			sStat[7];
	char			sSubmitTime[10];
	char			sDoneTime[10];
	//char			sDestTerminalId[21];
	char			sDestTerminalId[32];
	unsigned int	nSmscSeq;
} CMPP_STATUS_REPORT;

//**********************************************************************
//	STRUCTURE OF CMPP_LINKID.
//**********************************************************************
typedef struct cmpp_linkid {
	char			sMiscid[4];
	char			sDateTime[12];
	unsigned int	nSeqId;
} CMPP_LINKID;

//**********************************************************************
//	STRUCTURE OF CMPP_DELIVER.
//**********************************************************************
typedef struct cmpp_deliver {
	unsigned _int64	nMsgid;
	char			sDestid[21];
	char			sServiceid[10];
	unsigned char	uchTppid;
	unsigned char	uchTpudhi;
	unsigned char	uchMsgfmt;
	char			sSrcterminalid[32];
	unsigned char	uchSrcterminaltype;
	unsigned char	uchRegisteredDelivery;
	unsigned char	uchMsglength;
	union {
		char				sMsgcontent[256];
		CMPP_STATUS_REPORT	csr;
	} MO_Msg_Content;
	CMPP_LINKID		stLinkid;
} CMPP_DELIVER;

//**********************************************************************
//	STRUCTURE OF CMPP_SUBMIT.
//**********************************************************************
typedef struct cmpp_submit {
	unsigned _int64	nMsgid;
	unsigned char	uchPkTotal;
	unsigned char	uchPkNumber;
	unsigned char	uchRegisteredDelivery;
	unsigned char	uchMsgLevel;
	char			sServiceId[10];
	unsigned char	uchFeeUserType;
	char			sFeeTerminalId[32];
	unsigned char	uchFeeTerminalType;
	unsigned char	uchTpPid;
	unsigned char	uchTpUdhi;
	unsigned char	uchMsgFmt;
	char			sMsgSrc[6];					// 企业代码
	char			sFeeType[2];
	char			sFeeCode[6];
	char			sValidTime[17];
	char			sAtTime[17];
	char			sSrcId[21];					// SPID
	unsigned char	uchDstUsrTl;
	char			sDstTerminalId[32*100];
	unsigned char	uchDestTerminalType;
	unsigned char	uchMsgLength;
	char			sMsgContent[160];
	CMPP_LINKID		stLinkid;
} CMPP_SUBMIT;

//**********************************************************************
//	STRUCTURE OF CMPP_QUERY.
//**********************************************************************
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 {
	unsigned _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.

⌨️ 快捷键说明

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