📄 cmpp.h
字号:
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;
//**********************************************************************
//**处理CMPP2.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_nSmscSeqId; // smsc的序列号.
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, unsigned char &uchResult);
//发送请求连接应答(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);
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);
public:
// 一些功能函数.
// 得到当前的日期时间(MMDDhhmmss)
CString GetDoneTime();
unsigned _int64 GetMsgid();
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]; //短信网关的IP地址.
unsigned short ushPort; //短信网关的端口号.
char sLoginName[7]; //登录用户名
char sLoginPwd[MAX_PATH]; //SP的登录口令,最长20位.
// char sIcpId[7]; //SP_ID,sp的企业代码.
unsigned char uchVersion;
} LOGIN_PARAM;
//**********************************************************************
// STRUCTURE OF CLIENT_CONN.
//**********************************************************************
struct client_conn {
SOCKET hClient;
CString sIcpid;
CString sSpid;
int nVersion;
};
//**********************************************************************
// STRUCTURE OF SRVTHREAD_PARAM.
//**********************************************************************
struct srvthread_param {
CCmppServer* csServer;
TCPSocket* tsClient;
};
//
//用于处理消息和事件的线程池
//
class CJobCmpp2:public IJobDesc {
public:
CJobCmpp2(CMPP_SMGTOSP css, CCmppClient* cmppclient);
CJobCmpp2(CMPP_SPTOSMG css, CCmppServer* cmppserv);
~CJobCmpp2();
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 CWorkerCmpp2:public IWorker {
virtual void ProcessJob( IJobDesc* pJobDesc );
};
//******************************************************************************************************
//**CMPP2.0 CLIENT(SP模块)实现.
//******************************************************************************************************
class CMPP_API CCmppClient:public CCmpp
{
friend class CJob;
//private:
public:
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; //执行各种消息处理函数的线程池.
CWorkerCmpp2 m_worker;
CJobCmpp2 *m_pJob;
CCriticalSection m_socketCS;
int m_nSmgType; //网关类型,如适用于单连接(0),双连接(1)或双端口(1).
unsigned short m_ushMoport; //双端口时的MO Port.
unsigned short m_ushMtport; //双端口时的MT Port.
public:
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();
int ActiveTestMO();
int ActiveTestMT();
public:
CCmppClient();
~CCmppClient();
int Start(char *pchSmgIp, int nSmgPort, char *pchUserName, \
char *pchUserPwd, unsigned char uchVersion, \
void (*OnSmgMsg)(CMPP_SMGTOSP css), int nConnType = 0/*默认单连接*/, void (*OnLogFile)(LPCTSTR pchFmt, ...) = NULL);
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 CJobCmpp2;
//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);
// v2.21对客户端鉴权的函数
bool (*m_AuthClient)(char *pchIcpid, char *pchAuth, unsigned int nTimestamp, \
char *pchClientAddr, char *pchAuthSmg, char *pchSpId);
CThreadPool m_pool; //执行各种消息处理函数的线程池.
CWorkerCmpp2 m_worker;
CJobCmpp2 *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);
// V2.21判断该SPID是否已经登录
bool IsLogined(CString sSpId, SOCKET &hSock);
public:
CCmppServer();
~CCmppServer();
// int Start(void (*OnSpMsg)(CMPP_SPTOSMG css));
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 uchRegisteredDelivery, unsigned char uchMsgLen,\
char *pchMsgContent);
};
// 一些功能函数.
// 分解Msgid.
CMPP_API void ParseMsgid(unsigned _int64 nMsgId, CString& szDateTime, CString& szIsmgId, int& nMsgidSeq);
// 取子字符串.
CMPP_API CString GetSubStr(void* pchBuf, int nLen);
// 64位整数转换高低顺序.
CMPP_API unsigned _int64 hton64(unsigned _int64 ui64Src);
// 获取当前时间(YYMMDDhhmmss)
CMPP_API CString GetDateTime();
/************************************************************************/
/* 短连接方式的只发cmpp2.0 Client */
/************************************************************************/
class CMPP_API CShortCmppClient:public CCmppClient
{
public:
CShortCmppClient();
~CShortCmppClient();
int CShortCmppClient::ShortSubmit(char *pchSmgIp, int nSmgPort, char *pchUserName, \
char *pchUserPwd, unsigned char uchVersion, int nConnType, \
CString szMsgSrc, CString szSrcId, \
CString szDstTerminalId, CString szMsgContent);
};
#endif // !defined(AFX_CMPP_H__A4DFA71A_1AAF_4DE6_A299_3A154220E698__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -