📄 cmpp.h
字号:
//*******************************************************************************
//
// 文件名: Cmpp.h
// 描述:
// 中国移动通信互联网短信网关接口协议(China Mobile Point to Point)实现.
// 版本: 2.0
// 作者: PrinceToad(欢迎与我联系:princetoad@126.com)
// 日期: 2002-2003
// 介绍:
// 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
#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
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) {
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;
TCPSocket();
~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;
};
//
//定义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];
// char sSrcterminalid[32];
unsigned char sSrcterminaltype;
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -