⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmppconn.h

📁 SMAL是short message abstract library的缩写,是由风起水流软件工作室(www.zealware.com)开发的一个支持短信网关系统开发的C++底层抽象接口库
💻 H
📖 第 1 页 / 共 2 页
字号:
/**
 *	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 + -