?? cmpp.h
字號:
//*******************************************************************************
//
// 文件名: 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
#define PSEUCODE 1
#define TRUENUMBER 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;
// Edit by pt(2004.08.31)
char sLinkId[21];
} 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;
// Edit by pt(2004.08.31)
char sLinkId[21];
} 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;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -