?? cmpp.h
字號:
//**********************************************************************
// 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;
CMPP_QUERY pk_query;
CMPP_QUERY_RESP pk_queryresp;
CMPP_DELIVER pk_deliver;
CMPP_DELIVER_RESP pk_deliverresp;
CMPP_CANCEL pk_cancel;
CMPP_CANCEL_RESP pk_cancelresp;
CMPP_ACTIVETEST_RESP pk_activetestresp;
} pk_body;
} CMPP_PKG;
//**********************************************************************
//**處理CMPP3.0基本命令的類**
//**********************************************************************
class CMPP_API CCmpp
{
public:
CCmpp();
virtual ~CCmpp();
protected:
int m_nSocketTimeout;
void (*m_LogWrite)(LPCTSTR pchFmt, ...);
unsigned int m_nSeq;
char m_sIsmgId[7]; // 6位的Ismg_Id.
char m_sMiscId[5]; // 4位的Miscid.
unsigned short m_ushMsgidSeq; // Msgid中用到的流水號.
unsigned int m_nLinkSeqId; // Linid的序列號.
unsigned int m_nSmscSeqId; // smsc的序列號.
protected:
//接收SMG方面的所有消息
int RecvSmgMsg(TCPSocket* tsClient, cmpp_smgtosp* css, unsigned int &nResult);
//通過MD5算法構(gòu)造登錄請求包.
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, \
unsigned _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 *sLinkId);
//查詢發(fā)送短信狀態(tài)(Query)
int SendQuery(TCPSocket* tsClient, unsigned int nSeqId, char* pchTime, \
unsigned char uchQueryType, char* pchQueryCode);
//送交短信應(yīng)答(Deliver_Resp)
int SendDeliverResp(TCPSocket* tsClient, unsigned int nSeqId, unsigned _int64 nMsgId, unsigned int nResult);
//刪除短信操作
int SendCancel(TCPSocket* tsClient, unsigned int nSeqId, unsigned _int64 nMsgId);
//連接活動測試
int SendActiveTest(TCPSocket* tsClient, unsigned int nSeqId);
//接收cmppclient(sp)方面的消息
int RecvSpMsg(TCPSocket* tsClient, cmpp_sptosmg* css, unsigned int &nResult);
//發(fā)送請求連接應(yīng)答(Connect_Response)包
int SendConnectResp(TCPSocket* tsClient, unsigned int nSeqId, unsigned int nStatus, \
char *pchAuthSMG, unsigned char uchVersion);
//發(fā)送拆除連接應(yīng)答(Terminate_Response)包
int SendTerminateResp(TCPSocket* tsClient, unsigned int nSeqId);
//發(fā)送提交短信應(yīng)答(Submit_Response)包
int SendSubmitResp(TCPSocket* tsClient, unsigned int nSeqId, unsigned _int64 nMsgId, \
unsigned int nResult);
//發(fā)送查詢發(fā)送短信狀態(tài)應(yīng)答(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);
//發(fā)送送交消息(Deliver)包
int SendDeliver(TCPSocket* tsClient, unsigned int nSeqId, unsigned _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 *sLinkId);
//發(fā)送刪除短信應(yīng)答(Cancel_Response)包
int SendCancelResp(TCPSocket* tsClient, unsigned int nSeqId, unsigned int nSuccessId);
//發(fā)送活動連接測試應(yīng)答(Active_Test_Response)包
int SendActiveTestResp(TCPSocket* tsClient, unsigned int nSeqId);
unsigned int IncreaseSeqId();
void LogHex(CString szpre, char *msgContent, int nSize);
int ComposeCmppPkg(cmpp_pkg* cp, char* pchBuf, int nSize);
int TracePkg(cmpp_pkg* cp);
unsigned int IncreaseLinkSeqId();
public:
// 一些功能函數(shù).
// 得到當(dāng)前的日期時間(MMDDhhmmss)
CString GetDoneTime();
unsigned _int64 GetMsgid();
void GetLinkId(char *sLinkId);
unsigned int IncreaseSmscSeqId();
CString ConvertToHex(CString szpre, char *msgContent, int nSize);
public:
unsigned short IncreaseMsgIdSeq();
unsigned int GetSeqId();
};
//**********************************************************************
// STRUCTURE OF LOGIN_PARAM.
//**********************************************************************
typedef struct login_param {
char sSmgIp[16]; //短信網(wǎng)關(guān)的IP地址.
unsigned short ushPort; //短信網(wǎng)關(guān)的端口號.
char sLoginName[7]; //SP_ID,sp的企業(yè)代碼.
char sLoginPwd[MAX_PATH]; //SP的登錄口令,最長20位.
unsigned char uchVersion;
} LOGIN_PARAM;
//**********************************************************************
// STRUCTURE OF CLIENT_CONN.
//**********************************************************************
struct client_conn {
SOCKET hClient;
CString sIcpid;
CString sSpid;
int nVersion;
};
//**********************************************************************
// STRUCTURE OF CLIENT_PARA.(Verify Client)
//**********************************************************************
//struct client_para {
// CString sIcpid; // 企業(yè)代碼
// CString sPwd; // 口令
// CString sClientip; // 暫時不用
//};
//**********************************************************************
// 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 );
};
//******************************************************************************************************
//**CMPP3.0 CLIENT(SP模塊)實現(xiàn).
//******************************************************************************************************
class CMPP_API CCmppClient:public CCmpp
{
friend class CJob;
private:
TCPSocket m_socket; //單連接時用.
TCPSocket m_MoConn; //雙連接或雙端口時的MO連接.
TCPSocket m_MtConn; //雙連接或雙端口時的MT連接.
bool m_fStop; //停止標(biāo)志.
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; //執(zhí)行各種消息處理函數(shù)的線程池.
CWorker m_worker;
CJob *m_pJob;
CCriticalSection m_socketCS;
int m_nSmgType; //網(wǎng)關(guān)類型,如適用于單連接(0),雙連接(1)或雙端口(2).
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的回復(fù)消息.(雙連接的時候)
static DWORD WINAPI RecvMtFunc(LPVOID pParam);
virtual DWORD RecvMtProc();
int ActiveTestMO();
int ActiveTestMT();
public:
CCmppClient();
virtual ~CCmppClient();
int Start(char *pchSmgIp, int nSmgPort, char *pchUserName, \
char *pchUserPwd, unsigned char uchVersion, int nActivtestInterval, \
void (*OnSmgMsg)(CMPP_SMGTOSP css), int nConnType, \
void (*OnLogFile)(LPCTSTR pchFmt, ...) = NULL);
int Release();
int Submit(unsigned _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 *sLinkId);
int Query(char* pchTime, unsigned char uchQueryType, char* pchQueryCode = NULL);
int Cancel(unsigned _int64 nMsgId);
int ActiveTest();
//用于設(shè)置雙端口連接時的端口號.
void SetDoublePort(unsigned short ushMoport, unsigned short ushMtport);
};
//******************************************************************************************************
//**CMPP3.0 SERVER(網(wǎng)關(guān)部分)的實現(xiàn).
//******************************************************************************************************
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; // 本地監(jiān)聽線程的句柄
BOOL m_fStarted;
void (*m_pSpMsg)(CMPP_SPTOSMG css);
bool (*m_AuthClient)(char *pchIcpid, char *pchAuth, unsigned int nTimestamp, \
char *pchClientAddr, char *pchAuthSmg, char *pchSpId);
CThreadPool m_pool; //執(zhí)行各種消息處理函數(shù)的線程池.
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, CString sSpid, int nVersion);
bool IsLogined(CString sSpId, SOCKET &hSock);
public:
CCmppServer();
virtual ~CCmppServer();
int Start(char *pchServip, int nServport, void (*OnSpMsg)(CMPP_SPTOSMG css), \
void (*OnLogFile)(LPCTSTR pchFmt, ...), bool (*OnAuthClient)(char *pchIcpid, char *pchAuth, unsigned int nTimestamp, char *pchClientAddr, char *pchAuthSmg, char *pchSpId), \
char *pchIsmgId, char *pchMiscid, int nSocketTimeout);
void Release();
int Deliver(unsigned _int64 nMsgId, char *pchDestId, char *pchServiceId, \
unsigned char uchTppid, unsigned char uchTpudhi, unsigned char uchMsgFmt, \
char *pchSrcTerminalId, unsigned char uchSrcTerminalType, unsigned char uchRegisteredDelivery, \
unsigned char uchMsgLen, char *pchMsgContent, char *sLinkId);
};
// 一些功能函數(shù).
// 分解Msgid.
CMPP_API void ParseMsgid(unsigned _int64 nMsgId, CString& szDateTime, CString& szIsmgId, int& nMsgidSeq);
// 取子字符串.
CMPP_API CString GetSubStr(void* pchBuf, int nLen);
// 64位整數(shù)轉(zhuǎn)換高低順序.
CMPP_API unsigned _int64 hton64(unsigned _int64 ui64Src);
// 獲取當(dāng)前時間(YYMMDDhhmmss)
CMPP_API CString GetDateTime();
CMPP_API CString Base64Decode(char* sSrcStr, int nLen);
CMPP_API CString Base64Encode(char* sSrcStr, int nLen);
#endif // !defined(AFX_CMPP_H__A4DFA71A_1AAF_4DE6_A299_3A154220E698__INCLUDED_)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -