📄 cmpp.h
字号:
//**********************************************************************
// 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;
//**********************************************************************
//**处理CMPP2.0基本命令的类**
//**********************************************************************
class CMPP_API CCmpp
{
public:
CCmpp();
virtual ~CCmpp();
protected:
int m_nSocketTimeout;
protected:
//接收SMG方面的所有消息
int RecvSmgMsg(TCPSocket* tsClient, cmpp_smgtosp* css);
//通过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, \
_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 *pchLinkid*/);
//查询发送短信状态(Query)
int SendQuery(TCPSocket* tsClient, unsigned int nSeqId, char* pchTime, \
unsigned char uchQueryType, char* pchQueryCode);
//送交短信应答(Deliver_Resp)
int SendDeliverResp(TCPSocket* tsClient, unsigned int nSeqId, _int64 nMsgId, /*unsigned int nResult*/unsigned char uchResult);
//删除短信操作
int SendCancel(TCPSocket* tsClient, unsigned int nSeqId, _int64 nMsgId);
//连接活动测试
int SendActiveTest(TCPSocket* tsClient, unsigned int nSeqId);
//接收cmppclient(sp)方面的消息
int RecvSpMsg(TCPSocket* tsClient, cmpp_sptosmg* css);
//发送请求连接应答(Connect_Response)包
int SendConnectResp(TCPSocket* tsClient, unsigned int nSeqId,/* unsigned int nStatus*/unsigned char uchStatus, \
char *pchAuthSMG, unsigned char uchVersion);
//发送拆除连接应答(Terminate_Response)包
int SendTerminateResp(TCPSocket* tsClient, unsigned int nSeqId);
//发送提交短信应答(Submit_Response)包
int SendSubmitResp(TCPSocket* tsClient, unsigned int nSeqId, _int64 nMsgId, \
/*unsigned int nResult*/unsigned char uchResult);
//发送查询发送短信状态应答(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, _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 *pchLinkId*/);
//发送删除短信应答(Cancel_Response)包
int SendCancelResp(TCPSocket* tsClient, unsigned int nSeqId, /*unsigned int nSuccessId*/unsigned char uchSuccessId);
//发送活动连接测试应答(Active_Test_Response)包
int SendActiveTestResp(TCPSocket* tsClient, unsigned int nSeqId);
};
//**********************************************************************
// 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;
};
//**********************************************************************
// 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 );
};
//******************************************************************************************************
//**CMPP2.0 CLIENT(SP模块)实现.
//******************************************************************************************************
class CMPP_API CCmppClient:public CCmpp
{
friend class CJob;
private:
TCPSocket m_socket; //单连接时用.
TCPSocket m_MoConn; //双连接或双端口时的MO连接.
TCPSocket m_MtConn; //双连接或双端口时的MT连接.
int m_nSocketTimeout;
int m_nSeq;
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)或双端口(1).
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();
unsigned int IncreaseSeqId();
int ActiveTestMO();
int ActiveTestMT();
public:
CCmppClient();
virtual ~CCmppClient();
int Start(char *pchSmgIp, int nSmgPort, char *pchUserName, \
char *pchUserPwd, unsigned char uchVersion, \
void (*OnSmgMsg)(CMPP_SMGTOSP css), int nConnType = 0/*默认单连接*/);
int Release();
int Submit(_int64 nMsgId, unsigned char uchPKtotal, unsigned char uchPKnumber, \
unsigned char uchNeedreport, unsigned char uchMsglevel, char *pchServiceid, \
unsigned char uchFeeusertype, char *pchFeeterminalid, 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 uchMsglen, char *pchMsgcontent);
int Query(char* pchTime, unsigned char uchQueryType, char* pchQueryCode = NULL);
int Cancel(_int64 nMsgId);
// int DeliverResp(unsigned int nSeqId, _int64 nMsgId, /*unsigned int nResult*/unsigned char uchResult);
int ActiveTest();
unsigned int GetSeqId();
//用于设置双端口连接时的端口号.
void SetDoublePort(unsigned short ushMoport, unsigned short ushMtport);
};
//******************************************************************************************************
//**CMPP2.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);
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);
char* GetSubStr(char* pchBuf, int nLen, int nStart = 0);
public:
CCmppServer();
virtual ~CCmppServer();
int Start(void (*OnSpMsg)(CMPP_SPTOSMG css));
void Release();
};
#endif // !defined(AFX_CMPP_H__A4DFA71A_1AAF_4DE6_A299_3A154220E698__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -