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

📄 ~cngpconn.~h

📁 SMAL是short message abstract library的缩写,是由风起水流软件工作室(www.zealware.com)开发的一个支持短信网关系统开发的C++底层抽象接口库
💻 ~H
📖 第 1 页 / 共 2 页
字号:
/**
 *	cngpconn.h
 *	
 *	Short Message Abstractive Library.(SMAL)
 *
 *	Copyright 2003-2006	北京风起水流软件工作室
 *	
 *	http://www.zealware.com
 *	
 *	princetoad@gmail.com
 *
 */

#ifndef _CNGP_CONNECTION_H
#define _CNGP_CONNECTION_H

#include <smal.h>
#include <common/util.h>
#include <list>
#include <cngp2/cngp_message.h>
#include <common/tcpsocket.h>
#include <cngp2/cngpbase.h>
#include <common/threadpool.h>

class CNGPClient;

/// CNGP连接类
/**
 * CNGPConnection类,描述了一个到网通短信网关的连接,每个连接对应一个具体的TCP连接
 * 此连接成功建立后,就可以通过CNGPConnection对象进行消息的收发.
 */
class CNGPConnection : public CCngp  
{
public:
/**@name Construction	*/
//@{
	/** 构造函数
	 */
	CNGPConnection(
		CNGPClient           & _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 ConnectionType & _conntype,	            ///< 连接类型
		const int            & _nActivetestInterval,    ///< 活动测试间隔
		const char           * _localhost = NULL,       ///< 本地绑定地址
		const unsigned short & _localport = 0,          ///< 本地绑定端口
		BOOL                 sync = TRUE                ///< 是否在连接后发送登录包
		);

	/** 输出统计信息(收发的消息数,状态报告数等)
	*/
	virtual void DumpStatus();

	/** 析构函数
	 */
	virtual ~CNGPConnection();
	//@}

/**@name GetFunctions	*/
//@{
	/** 返回所属的client 
	*/
	CNGPClient & GetClient() const
	{		return client;	}

	/** 返回连接标识 
	*/
	const char * GetToken() const
	{		return token;		}

	/** 返回网关地址 
	*/
	const char * GetSmgHost() const
	{		return smghost;		}

	/** 返回网关端口 
	*/
	int GetSmgPort() const
	{		return (int)smgport;	}

	/** 返回登录用户名 
	*/
	const char * GetUserName() const
	{		return username;	}

	/** 返回登录口令 
	*/
	const char * GetPassword() const
	{		return password;	}

	/** 返回连接类型 
	*/
	ConnectionType GetConnectionType() const
	{		return conntype;	}

	/** 返回发送的SUBMIT消息数 
	*/
	long GetSubmitCount() const
	{	return submitCount;		}

	/** 返回发送成功的SUBMIT消息数 
	*/
	long GetSubmitSucceedCount() const
	{	return submitSucceedCount;		}

	/** 返回发送失败的SUBMIT消息数 
	*/
	long GetSubmitFailedCount() const
	{	return submitFailedCount;		}

	/** 返回失败的SUBMITResponse消息数 
	*/
	long GetRespFailedCount() const
	{	return respFailedCount;		}

	/** 返回成功的SUBMITResponse消息数 
	*/
	long GetRespSucceedCount() const
	{	return respSucceedCount;		}

	/** 返回收到的Deliver消息数 
	*/
	long GetDeliverCount() const
	{	return deliverCount;		}

	/** 返回收到的StatusReport消息数 
	*/
	long GetStatusReportCount() const
	{	return sreportCount;		}

	/** 返回当前连接是否忙碌(忙碌表示正在收发消息) 
	*/
	BOOL IsBusy() const
	{	return m_fBusy;		}

	/** 连接是否已经启动 
	*/
	BOOL IsOpened()
	{		return m_fLogined && m_fStarted;	}

	/** 连接是否可用 
	*/
	BOOL IsReady()
	{		return IsOpened() && !IsBusy();	}

	/** 是否可以发送消息 
	*/
	BOOL CanMakeSubmit()
	{		return (conntype != e_RecvOnly) && IsReady();	}

	//@}

	/**@name CNGP Command Function */
	//@{

	/** 清除连接 */
	void Clear();

	/** 提交SUBMIT消息 
	*/
	inline int Submit(
		cngp_submit & _message    ///< 要发送的cngp_submit消息
	);

	/** 主动发活动测试包 
	*/
	inline int ActiveTest();
	//@}

	/**@name 消息响应函数 */
	//@{
	/** 登录网关成功时调用 
	*/
	virtual void OnLogined();

	/** 登录网关失败时调用 
	*/
	virtual void OnLoginFailed(
		int errorCode    ///< 错误返回值
		);

	/** 同网关连接断开时调用 
	*/
	virtual void OnCleared();

	/** 发送SUBMIT消息前调用,如果返回失败,则停止发送SUBMIT消息.
		在这里,只是简单地返回TRUE.
	 */
	virtual BOOL OnSubmiting(
		cngp_submit _message    ///< 即将提交发送的cngp_submit消息
		);

	/** 发送SUBMIT消息成功时调用 
	*/
	virtual void OnSubmited(
		cngp_submit _message    ///< 已经成功发送的cngp_submit消息
		);

	/** 发送SUBMIT消息失败时调用 */
	virtual void OnSubmitFailed(
		cngp_submit _message    ///< 发送失败的cngp_submit消息
		);

	/** 收到CONNECT_RESPONSE时调用 
	*/
	virtual void OnReceivedConnectResponse(
		cngp_login_resp _message
		);

	/** 收到Terminate消息时调用 
	*/
	virtual void OnReceivedTerminate();

	/** 收到SUBMIT_RESPONSE时调用 
	*/
	virtual void OnReceivedSubmitResponse(
		cngp_submit_deliver_resp _message
		);

	/** 收到Deliver消息时调用 
	*/
	virtual void OnReceivedDeliver(
		cngp_deliver _message
		);

	/** 收到STATUS_REPORT时调用 
	*/
	virtual void OnReceivedStatusReport(
		cngp_deliver _message
		);

	/** 收到活动测试消息时调用 
	*/
	virtual void OnReceivedActiveTest();

	/** 收到活动测试回复消息时调用 
	*/
	virtual void OnReceivedActiveTestResponse();

	/**输出日志时调用
		格式化输出日志,默认是把内容//TRACE出来
	 */
	virtual void OnLogWrite(const char * pchFmt, ...);
	//@}

	BOOL						isOK;

protected:

	/** 初始化变量 
	*/
	void Initialize();

	/** 设置当前连接忙闲状态 
	*/
	void SetBusy( BOOL status )
	{	m_fBusy = status;	}

	/** 建立网关连接,启动消息接收模块 
	*/
	int CreateConnection();

	/** 连接网关,登录网关 
	*/
	int Connect( 
		BOOL outputdebug = TRUE    ///< 是否输出调试信息
		);

	/** 断开连接 
	*/
	void Terminate();

	/** 接收SMG方面的所有消息 
	*/
	inline int RecvSmgMsg(
		cngp_smgtosp		* css, 
		unsigned int		& nResult
		);

	/** 用于接收消息线程
	*/
	static DWORD WINAPI RecvFunc(LPVOID pParam);

	/** 接收消息函数
	*/
	virtual DWORD RecvProc();

	void AdjustActiveTestTimer( int & timeout );

protected:
	CNGPClient     & client;              ///< 所属client
	char           token[MAX_PATH];       ///< 连接ID(YYMMDDhhmmsslll)
	char           localhost[MAX_PATH];   ///< 本地绑定地址
	unsigned short localport;		      ///< 本地绑定端口
	char           smghost[MAX_PATH];     ///< 网关地址
	unsigned short smgport;               ///< 网关端口
	unsigned char  smgversion;            ///< 网关支持的最高版本号
	char           username[MAX_PATH];    ///< 网关登录用户名
	char           password[MAX_PATH];    ///< 网关登录口令
	ConnectionType conntype;              ///< 网关连接类型

	TCPSocket      m_socket;              ///< TCPSOCKET类
	BOOL           m_fStop;               ///< 停止标志.
	BOOL           m_fLogined;            ///< 是否成功登录
	BOOL           m_fStarted;            ///< 是否成功启动
	BOOL           m_fBusy;               ///< 是否正在发送消息

	int            m_RetryInterval;       ///< 重试时间间隔(ms)
	BOOL           m_fAutoResp;           ///< 是否自动回复
	MyCriticalSection m_socketCS;         ///< socket句柄锁
	HANDLE         m_hRecvThread;         ///< 接收线程句柄.

	char           connectTime[MAX_PATH]; ///< 成功连接网关的时间
	char           loginTime[MAX_PATH];   ///< 成功登录时间
	char           disconnectTime[MAX_PATH]; ///< 断开时间

	long           submitCount;            ///< 提交的SUBMIT消息数
	long           submitSucceedCount;     ///< SUBMIT发送成功消息数
	long           submitFailedCount;      ///< SUBMIT发送失败消息数
	long           respSucceedCount;       ///< 收到的submitresponse消息数
	long           respFailedCount;        ///< 收到的submitresponse消息数
	long           deliverCount;           ///< 收到的Deliver消息数
	long           sreportCount;           ///< 状态报告数
};

/**
 * CNGPConnection连接队列
 */
typedef std::list<CNGPConnection*> aList;

//
// 用于处理消息和事件的线程池
//
class CJobCngp : public IJobDesc {
public:
	CJobCngp(
		CNGPClient	& _client, 
		CNGPConnection	& _connection, 
		JobType _type
		);

	CJobCngp(
		CNGPClient	& _client, 
		CNGPConnection	& _connection, 
		JobType _type, 
		cngp_submit_deliver_resp _message
		);

	CJobCngp(
		CNGPClient	& _client, 
		CNGPConnection	& _connection, 
		JobType _type, 
		cngp_deliver _message
		);

	CJobCngp(
		CNGPClient	& _client, 
		CNGPConnection	& _connection, 
		JobType _type, 
		cngp_submit _message, 
		int nResult = 0
		);

	~CJobCngp();

	void	OnSendSubmit();
	void	OnSubmitSucceed();
	void	OnDeliver();
	void	OnStatusReport();
	void	OnActiveTestResponse();
	void	OnActiveTest();
	void	OnCancelResponse();
	void	OnTerminate();
	void	OnConnectResponse();
	void	OnSubmitFailed();
	void	OnSubmitResponse();
	void	OnSubmiting();
	JobType type;

protected:
	CNGPClient & client;
	CNGPConnection & connection;
	cngp_submit submitMsg;
	cngp_deliver deliverMsg;
	cngp_login_resp connectRespMsg;
	cngp_submit_deliver_resp submitRespMsg;
	int	nResult;

};

class CWorkerCngp : public IWorker {
	virtual void ProcessJob( IJobDesc* pJobDesc );
};

/// CNGPClient终端类实现
/**
 * CNGPClient类,表示一个CNGP短信终端,一个终端可以包括数个CNGPConnection对象,
 * 并且可以对这些连接进行管理.
 */
class CNGPClient 
{
public:
	/**@name Construction */
	//@{
	CNGPClient();

	virtual ~CNGPClient();
	//@}

	/**@name GetFunctions */
	//@{
	/**得到提交的SUBMIT消息数 
	*/
	long GetSubmitCount() const
	{	return submitCountTotal;		}

	/**得到发送成功的SUBMIT消息数 
	*/
	long GetSubmitSucceedCount() const
	{	return submitSucceedCountTotal;		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -