📄 cmpp.h
字号:
//*******************************************************************************
//
// 文件名: Cmpp.h
// 描述:
// 中国移动通信互联网短信网关接口协议(China Mobile Point to Point)实现.
// 版本: V2.2 (Last Update Apr.18.04!)
// 作者: PrinceToad(欢迎与我联系:princetoad@126.com)
// 日期: 2002-2004
// 介绍:
// 1.能够自动适应以下网关类型:标准cmpp类型(单连接,如华为,思特奇,标准东软),
// 双连接类型(MO,MT分连接进行,通过登录包的Version字段区分,如亚信(ASIA)),
// 双端口类型(MO,MT连接不同的网关端口,通过端口号区分,如清华声讯(TSSX))
// 2.效率高,稳定性强.
//
// 免费提供SP短消息网关开发接口库下载使用(CMPP2.0, CMPP3.0, SGIP1.2),
// 免费提供技术支持!
//
// Http://princetoad.xiloo.com.
// SourceCode On Sale!
//
//*******************************************************************************
#ifndef CMPP_20_H
#define CMPP_20_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
#include "ThreadPool.h"
#ifdef CMPP_IMPORT
#define CMPP_API __declspec(dllimport)
#else
#define CMPP_API __declspec(dllexport)
#endif
#define SOCKET_TIMEOUT 3
#define SOCKET_CLOSED -1
//Error Code
#define CMPP_UNLOGOIN 1 //客户端没有登录.
//#define PRINTOUT TRACE
#define PRINTOUT printf
//网关类型
#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, bool fAscii = false) {
//增加了对pvData是否为空的判断.
if (pvData != NULL) {
if (fAscii) {
CopyMemory(m_str+m_nLen, pvData, strlen((char*)pvData) > nLen ? nLen : strlen((char*)pvData));
}
else {
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;
}
};
//
//定义Cmpp2.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 {
_int64 nMsgid;
unsigned char uchResult;
// unsigned int nResult;
} CMPP_SUBMIT_RESP, CMPP_DELIVER_RESP;
//**********************************************************************
// STRUCTURE OF CMPP_DELIVER_StatusReport.
//**********************************************************************
typedef struct cmpp_status_report {
_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_DELIVER.
//**********************************************************************
typedef struct cmpp_deliver {
_int64 nMsgid;
char sDestid[21];
char sServiceid[10];
unsigned char uchTppid;
unsigned char uchTpudhi;
unsigned char uchMsgfmt;
char sSrcterminalid[21];
unsigned char uchRegisteredDelivery;
unsigned char uchMsglength;
union {
char sMsgcontent[256];
CMPP_STATUS_REPORT csr;
} MO_Msg_Content;
char sReserved[8];
// char sLinkid[20];
} CMPP_DELIVER;
//**********************************************************************
// STRUCTURE OF CMPP_SUBMIT.
//**********************************************************************
typedef struct cmpp_submit {
_int64 nMsgid;
unsigned char uchPkTotal;
unsigned char uchPkNumber;
unsigned char uchRegisteredDelivery;
unsigned char uchMsgLevel;
char sServiceId[10];
unsigned char uchFeeUserType;
char sFeeTerminalId[21];
// 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];
unsigned char uchDstUsrTl;
char sDstTerminalId[21*100];
// char sDstTerminalId[32*100];
// unsigned char uchDestTerminalType;
unsigned char uchMsgLength;
char sMsgContent[160];
char sReserved[8];
// char sLinkId[20];
} 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 {
_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;
//**********************************************************************
// 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -