📄 cmppconn.h
字号:
/**
* cmppconn.h
*
* Short Message Abstractive Library.(SMAL)
*
* Copyright 2003-2006 北京风起水流软件工作室
*
* http://www.zealware.com
*
* princetoad@gmail.com
*
* V1.5 2008/02/15
* 修改滑动窗口和增加内部重发功能
*
* V1.4 2008/01/07
* 修正长短信造成的消息长度的一个BUG
*
* V1.3 2007/12/11 23:15
* 增加了deliver消息接收时间的记录
*
* V1.2 2007/08/11 18:10
* 修正发送活动测试的一个BUG.
*
* V1.1
* 修正一个BUG,升级CMPP2,3兼容后的一个LINKID拷贝问题.(2007/08/08)
*
*/
#ifndef _CMPP_CONNECTION_H
#define _CMPP_CONNECTION_H
#include <smal.h>
#include <common/util.h>
#include <list>
#include <cmpp/cmpp_message.h>
#include <common/tcpsocket.h>
#include <cmpp/cmppbase.h>
#include <common/threadpool.h>
class CMPPClient;
///////////////////////////////////////////////////////////////////////////////
//
/// CMPP连接类
/** 实现了一个CMPP连接,用户可以通过一个连接进行消息收发,连接本身具有活动测试,断开自动重连等功能.
*/
//##ModelId=46B5D43C03B9
class CMPPConnection : public CCmpp
{
public:
/**@name Construction */
//@{
/**构造函数
*/
//##ModelId=46B5D43C03CD
CMPPConnection(
CMPPClient & _client, ///< connection所属的client
const char * _token, ///< connection的标识
const char * _smghost, ///< 网关地址
const unsigned short & _smgport, ///< 网关端口
const unsigned char & _smgversion, ///< 网关版本号
const char * _username, ///< 登录用户名
const char * _password, ///< 登录口令
const char * _icpid, ///< 企业代码
const ConnectionType & _conntype, ///< 连接类型
const BOOL & _isAsiaInfoSmg, ///< 是否是亚信网关
const int & _nActivetestInterval, ///< 活动测试间隔
const int & _nConnectionTimeout, ///< 连接超时时间
BOOL sync = TRUE, ///< 是否同步,直到连接建立
const long _window_clamp = 16 ///< 滑动窗口大小
);
/**打印统计信息
*/
//##ModelId=46B5D43D0017
virtual void DumpStatus();
/**析构函数
*/
//##ModelId=46B5D43D0035
virtual ~CMPPConnection();
//@}
/**@name GetFunctions */
//@{
/**得到连接所属的client
*/
//##ModelId=46B5D43D005D
CMPPClient & GetClient() const
{ return client; }
/**得到连接标识
*/
//##ModelId=46B5D43D0067
const char * GetToken() const
{ return token; }
/**得到网关地址
*/
//##ModelId=46B5D43D0071
const char * GetSmgHost() const
{ return smghost; }
/**得到网关端口
*/
//##ModelId=46B5D43D0073
int GetSmgPort() const
{ return (int)smgport; }
/**得到登录用户名
*/
//##ModelId=46B5D43D007B
const char * GetUserName() const
{ return username; }
/**得到登录口令
*/
//##ModelId=46B5D43D0085
const char * GetPassword() const
{ return password; }
/**得到企业代码(ICPID)
*/
//##ModelId=46B5D43D008F
const char * GetICPID() const
{ return icpid; }
/**得到连接类型
*/
//##ModelId=46B5D43D0099
ConnectionType GetConnectionType() const
{ return conntype; }
/**是否是亚信网关
*/
//##ModelId=46B5D43D009B
BOOL IsAisaInfoSmg() const
{ return isAsiaInfoSmg; }
/**得到发送的SUBMIT消息数
*/
//##ModelId=46B5D43D00A3
long GetSubmitCount() const
{ return submitCount; }
/**得到发送成功的SUBMIT消息数
*/
//##ModelId=46B5D43D00AD
long GetSubmitSucceedCount() const
{ return submitSucceedCount; }
/**得到发送失败的SUBMIT消息数
*/
//##ModelId=46B5D43D00B7
long GetSubmitFailedCount() const
{ return submitFailedCount; }
/**得到失败的SUBMITResponse消息数
*/
//##ModelId=46B5D43D00B9
long GetRespFailedCount() const
{ return respFailedCount; }
/**得到成功的SUBMITResponse消息数
*/
//##ModelId=46B5D43D00C1
long GetRespSucceedCount() const
{ return respSucceedCount; }
/**得到收到的Deliver消息数
*/
//##ModelId=46B5D43D00CB
long GetDeliverCount() const
{ return deliverCount; }
/**得到收到的StatusReport消息数
*/
//##ModelId=46B5D43D00D5
long GetStatusReportCount() const
{ return sreportCount; }
///** 得到连续活动测试总数
//*/
//long GetActiveTestCount() const
//{ return iTimeoutCount; }
DWORD GetLastTickCount() const
{ return iLastMessageTicket; }
/**当前连接是否忙碌
*/
//##ModelId=46B5D43D00D7
BOOL IsBusy() const
{ return m_fBusy; }
/**设置当前连接忙闲状态
*/
//##ModelId=46B5D43D00E0
void SetBusy(BOOL status)
{ m_fBusy = status; }
/**连接是否已经启动
*/
//##ModelId=46B5D43D00E9
BOOL IsOpened()
{ return m_fLogined && m_fStarted; }
/**连接是否可用
*/
//##ModelId=46B5D43D00F3
BOOL IsReady()
{ return IsOpened() && !IsBusy(); }
/**是否可以发送消息
*/
//##ModelId=46B5D43D00F4
BOOL CanMakeSubmit()
{ return (conntype != e_RecvOnly) && IsReady() && (current_windows_size<=max_window_clamp); }
//@}
/**@name CMPP Command Function */
//@{
/**发送SUBMIT消息
*/
//##ModelId=46B5D43D00FD
inline int Submit(
cmpp_submit & _message
);
/**主动发活动测试包
*/
//##ModelId=46B5D43D011B
inline int ActiveTest();
//@}
/**@name Callback functions */
//@{
/**登录网关成功时调用
*/
//##ModelId=46B5D43D0139
virtual void OnLogined();
/**登录网关失败时调用
*/
//##ModelId=46B5D43D0143
virtual void OnLoginFailed(int errorCode);
/**同网关连接断开时调用
*/
//##ModelId=46B5D43D0157
virtual void OnCleared();
/**发送SUBMIT消息前调用,如果返回失败,则停止发送SUBMIT消息.
在这里,只是简单地返回TRUE.
*/
//##ModelId=46B5D43D0161
virtual BOOL OnSubmiting(cmpp_submit _message);
/**发送SUBMIT消息成功时调用
*/
//##ModelId=46B5D43D016B
virtual void OnSubmited(cmpp_submit _message);
/**发送SUBMIT消息失败时调用
*/
//##ModelId=46B5D43D017F
virtual void OnSubmitFailed(cmpp_submit _message/*, unsigned nResult*/);
/**收到CONNECT_RESPONSE时调用
*/
//##ModelId=46B5D43D0189
virtual void OnReceivedConnectResponse(cmpp_connect_resp _message);
/**收到Terminate消息时调用
*/
//##ModelId=46B5D43D0193
virtual void OnReceivedTerminate();
/**收到SUBMIT_RESPONSE时调用
*/
//##ModelId=46B5D43D01A7
virtual void OnReceivedSubmitResponse(cmpp_submit_deliver_resp _message);
/**收到Deliver消息时调用
*/
//##ModelId=46B5D43D01B1
virtual void OnReceivedDeliver(cmpp_deliver _message);
/**收到STATUS_REPORT时调用
*/
//##ModelId=46B5D43D01BB
virtual void OnReceivedStatusReport(cmpp_deliver _message);
/**收到活动测试消息时调用
*/
//##ModelId=46B5D43D01C5
virtual void OnReceivedActiveTest();
/**收到活动测试回复消息时调用
*/
//##ModelId=46B5D43D01D9
virtual void OnReceivedActiveTestResponse();
/**输出日志时调用
格式化输出日志,默认是把内容//TRACE出来
*/
//##ModelId=46B5D43D01E3
virtual void OnLogWrite(const char * pchFmt, ...);
//@}
//##ModelId=46B5D43D01ED
BOOL isOK;
/**清除连接
*/
//##ModelId=46B5D43D01F7
void Clear();
protected:
/**初始化变量
*/
//##ModelId=46B5D43D0201
void Initialize();
/**建立网关连接
*/
//##ModelId=46B5D43D0229
int CreateConnection();
/**连接并尝试登录网关
*/
//##ModelId=46B5D43D023D
int Connect();
/**断开连接
*/
//##ModelId=46B5D43D0266
void Terminate();
/**接收SMG方面的所有消息
*/
//##ModelId=46B5D43D0284
inline int RecvSmgMsg(
cmpp_smgtosp * css,
unsigned long & nResult
);
/**用于接收消息
*/
//##ModelId=46B5D43D02A2
static DWORD WINAPI RecvFunc(LPVOID pParam);
//##ModelId=46B5D43D02B6
virtual DWORD RecvProc();
private:
//protected:
//##ModelId=46B5D43D02CA
CMPPClient & client; ///< 所属client
//##ModelId=46B5D43D02CE
char token[MAX_PATH]; ///< 连接ID(YYMMDDhhmmsslll)
//##ModelId=46B5D43D02D4
char smghost[MAX_PATH]; ///< 网关地址
//##ModelId=46B5D43D02D5
unsigned short smgport; ///< 网关端口
//unsigned char smgversion; ///< 网关支持的最高版本号
//##ModelId=46B5D43D02DE
char username[MAX_PATH]; ///< 网关登录用户名
//##ModelId=46B5D43D02DF
char password[MAX_PATH]; ///< 网关登录口令
//##ModelId=46B5D43D02E8
char icpid[MAX_PATH]; ///< 企业代码
//##ModelId=46B5D43D02F3
ConnectionType conntype; ///< 网关连接类型
//##ModelId=46B5D43D02F7
BOOL isAsiaInfoSmg; ///< 是否是亚信网关
//##ModelId=46B5D43D02FD
TCPSocket m_socket; ///< TCPSOCKET类
//##ModelId=46B5D43D0306
BOOL m_fStop; ///< 停止标志.
//##ModelId=46B5D43D0307
BOOL m_fLogined; ///< 是否成功登录
//##ModelId=46B5D43D0310
BOOL m_fStarted; ///< 是否成功启动
//##ModelId=46B5D43D0311
BOOL m_fBusy; ///< 是否正在发送消息
//##ModelId=46B5D43D031A
int m_RetryInterval;///< 重试时间间隔(ms)
//##ModelId=46B5D43D0324
BOOL m_fAutoResp; ///< 是否自动回复
//##ModelId=46B5D43D0326
MyCriticalSection m_socketCS; ///< socket句柄锁
//##ModelId=46B5D43D032E
HANDLE m_hRecvThread; ///< 接收线程句柄.
int m_nConnectionTimeout; ///< 连接超时时间
//##ModelId=46B5D43D0338
char connectTime[MAX_PATH]; ///< 成功连接网关的时间
//##ModelId=46B5D43D0339
char loginTime[MAX_PATH]; ///< 成功登录时间
//##ModelId=46B5D43D0342
char disconnectTime[MAX_PATH]; ///< 断开时间
//##ModelId=46B5D43D0343
long submitCount; ///< 提交的SUBMIT消息数
//##ModelId=46B5D43D034C
long submitSucceedCount; ///< SUBMIT发送成功消息数
//##ModelId=46B5D43D0356
long submitFailedCount;///< SUBMIT发送失败消息数
//##ModelId=46B5D43D0357
long respSucceedCount;///< 收到的submitresponse消息数
//##ModelId=46B5D43D0360
long respFailedCount;///< 收到的submitresponse消息数
//##ModelId=46B5D43D0361
long deliverCount; ///< 收到的Deliver消息数
//##ModelId=46B5D43D036A
long sreportCount; ///< 状态报告数
//##ModelId=46B5D43D036B
int length_loginresponse;
//##ModelId=46B5D43D0374
int length_result;
//##ModelId=46B5D43D037E
int length_submitresponse;
//##ModelId=46B5D43D037F
int length_deliver_msglenpos;
//##ModelId=46B5D43D0388
int length_deliver_nomsg;
//##ModelId=46B5D43D0389
int length_msisdn;
//##ModelId=46B5D43D0392
int length_statusreport;
//##ModelId=46B5D43D0393
int length_linkid;
//int iTimeoutCount; ///< 超时活动测试数
//int iMaxActiveTests; ///< 最大空闲活动测试数
DWORD iLastMessageTicket;
long max_window_clamp; ///< 滑动窗口限制
long current_windows_size; ///< 当前滑动窗口大小
};
///////////////////////////////////////////////////////////////////////////////
//
//##ModelId=46B5D43E000E
class CJobCmpp : public IJobDesc {
public:
//##ModelId=46B5D43E0019
CJobCmpp(CMPPClient & _client, CMPPConnection & _connection, JobType _type);
//##ModelId=46B5D43E0022
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -