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

📄 ~smppconn.~h

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

#ifndef _SMPP34_CONNECTION_H
#define _SMPP34_CONNECTION_H

#include <smal.h>
#include <common/util.h>
#include <list>
#include <smpp3/smpp_message.h>
#include <common/tcpsocket.h>
#include <smpp3/smppbase.h>
#include <common/threadpool.h>

class SMPPClient;

///////////////////////////////////////////////////////////////////////////////
//

class SMPPConnection : public CSmpp  
{
public:
/**@name Construction	*/
//@{
	/**构造函数
	 */
	SMPPConnection(
		SMPPClient				& _client,					///< connection所属的client
		const char * _token,						///< connection的标识
		const char * _serverHost,				///< 网关地址
		const unsigned short & _serverPort,					///< 网关端口
		const ConnectionType & _connectionType,				///< 连接类型
		const char * _systemID,				///< 登录用户名
		const char * _password,				///< 登录口令
		const char * _systemType,				///< 接口类型
		const unsigned char	& _interfaceVersion,			///< 网关版本号
		const int & _nActivetestInterval,	///< 活动测试间隔
		BOOL sync = TRUE						///< 是否同步,直到连接建立
		);

	/**打印统计信息
	*/
	virtual void DumpStatus();

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

/**@name GetFunctions	*/
//@{
	/**得到连接所属的client 
	*/
	SMPPClient & GetClient() const
	{		return client;	}

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

	/**得到短信中心地址 
	*/
	const char * GetSmscHost() const
	{		return server_host;		}

	/**得到短信中心端口 
	*/
	int GetSmscPort() const
	{		return (int)server_port;	}

	/**得到登录用户名 
	*/
	const char * GetSystemID() const
	{		return system_id;	}

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

	/**得到接口类型 
	*/
	const char * GetSystemType() const
	{		return system_type;		}

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

	/** 得到系统版本号
	*/
	int GetInterfacVersion() const
	{	return (int)interface_version;	}

	/**得到发送的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;		}

	/**当前连接是否忙碌 
	*/
	BOOL IsBusy() const
	{	return m_fBusy;		}

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

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

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

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

	//@}

	/**@name SMPP Command Function */
	//@{
	/**发送SUBMIT消息 
	*/
	inline int Submit(
		PDU_SMPP_SUBMIT_SM & _message
	);

	//@}

	/**@name Callback functions */
	//@{
	/**登录网关成功时调用 
	*/
	virtual void OnLogined();

	/**登录网关失败时调用 
	*/
	virtual void OnLoginFailed(int errorCode);

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

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

	/**发送SUBMIT消息成功时调用 
	*/
	virtual void OnSubmited(PDU_SMPP_SUBMIT_SM _message);

	/**发送SUBMIT消息失败时调用 
	*/
	virtual void OnSubmitFailed(PDU_SMPP_SUBMIT_SM _message/*,	unsigned nResult*/);

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

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

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

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

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

protected:

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

	/**建立网关连接 
	*/
	int CreateConnection();

	/**连接并尝试登录网关 
	*/
	int Bind();

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

	/**接收SMG方面的所有消息 
	*/
	inline int RecvSmscMsg(
		PDU_SMPP_SMSC_TO_ESME 	* message, 
		unsigned			long &	nResult
		);

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

	virtual DWORD RecvProc();

	private:
//protected:
	SMPPClient		& client;				///< 所属client
	char			token[MAX_PATH];					///< 连接ID(YYMMDDhhmmsslll)
	char			server_host[MAX_PATH];			///< 网关地址
	unsigned short	server_port;			///< 网关端口
	unsigned char	interface_version;		///< 网关支持的最高版本号
	char			system_id[MAX_PATH];				///< 网关登录用户名
	char			password[MAX_PATH];				///< 网关登录口令
	ConnectionType	conntype;				///< 网关连接类型
	char		system_type[MAX_PATH];

	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;		///< 状态报告数
};

///////////////////////////////////////////////////////////////////////////////
//

class CJobSmpp : public IJobDesc {
public:
	CJobSmpp(SMPPClient	& _client, SMPPConnection	& _connection, JobType _type);

	CJobSmpp(SMPPClient	& _client, SMPPConnection	& _connection, JobType _type, PDU_SMPP_SUBMIT_SM_RESP _message);

	CJobSmpp(SMPPClient	& _client, SMPPConnection	& _connection, JobType _type, PDU_SMPP_DELIVER_SM _message);

	~CJobSmpp();

	void	OnSendSubmit();
	void	OnSubmitSucceed();
	void	OnDeliver();
	void	OnTerminate();
	void	OnConnectResponse();
	void	OnSubmitFailed();
	void	OnSubmitResponse();
	void	OnSubmiting();
	JobType						type;

protected:
	SMPPClient			&	client;
	SMPPConnection		&	connection;
	PDU_SMPP_SUBMIT_DELIVER_SM		sdMsg;
	//PDU_SMPP_DELIVER_SM		deliverMsg;
	PDU_SMPP_BIND_RESP		connectRespMsg;
	PDU_SMPP_SUBMIT_DELIVER_SM_RESP sdRespMsg;
	//int						nResult;
};

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

///////////////////////////////////////////////////////////////////////////////
//

typedef std::list<SMPPConnection*> aList;

class SMPPClient 
{
public:
	/**@name Construction */
	//@{
	SMPPClient();

	virtual ~SMPPClient();
	//@}

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

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

	/**得到发送失败的SUBMIT消息数 
	*/
	long GetSubmitFailedCount() const
	{	return submitFailedCountTotal;		}

	/**得到失败的SUBMITResponse消息数 
	*/
	long GetRespFailedCount() const
	{	return respFailedCountTotal;		}

	/**得到成功的SUBMITResponse消息数 
	*/
	long GetRespSucceedCount() const
	{	return respSucceedCountTotal;		}

	/**得到收到的Deliver消息数 
	*/
	long GetDeliverCount() const
	{	return deliverCountTotal;		}

	//@}

	/**@name Main Functions */
	//@{

	/**初始化Client函数.
	注意: 每个Client在进行所有操作之前必须调用Initialize()进行初始化操作
	@param nMinWorkThreadsCount	指定线程池要启用的初始线程数
	@param nMaxWorkThreadsCount	指定线程池允许使用的最大线程数
	*/
	void Initialize(
		unsigned nMinWorkThreadsCount = 4,
		unsigned nMaxWorkThreadsCount = 8
		);

	/**建立一个连接 
	@param _smghost 要连接的网关地址
	@param _smgport	要连接的网关端口号
	@param _username 登录用户名
	@param _password 登录口令
	@param _icpid	企业代码
	@param _conntype 连接类型
	@param _isAsiaInfoSmg 是否是亚信网关
	@param _nActivetestInterval 活动测试时间间隔
	@param sync	是否同时登录网关(一般填TRUE)
	@return 如果成功连接的话,'''''''''''''''''''''''''''''''''''''''''''''']
	返回该连接的指针
	*/
	SMPPConnection * MakeConnection(
		const char * _smschost,
		const unsigned short & _smscport,
		const ConnectionType & _conntype,
		const char * _username,
		const char * _password,
		const char * _systemtype,
		const unsigned char	& _interfaceversion,
		const int			& _nActivetestInterval,
		BOOL				sync
		);

	/**停止网关服务
	 */
	virtual void Release();

	/**清除连接 
	*/
	void ClearConnection(const char * token);

	/**清除当前Client中的所有连接 
	*/
	void ClearAllConnections();

	/**发送一条Submit消息 
	*/
	int Submit(PDU_SMPP_SUBMIT_SM & message);

	//@}

	/**@name Callback functions */
	//@{
	/**登录网关成功时调用 
	*/
	virtual void OnConnectionLogined(SMPPConnection & connection)
	{
		return;
	}

	/**登录网关失败时调用 
	*/
	virtual void OnConnectionLoginFailed(
		SMPPConnection & connection,
		int errorCode
		)
	{
		return;
	}

	/**同网关连接断开时调用 
	*/
	virtual void OnConnectionCleared(SMPPConnection & connection)
	{
		return;
	}

	/**发送SUBMIT消息前调用,如果返回失败,则停止发送SUBMIT消息.
	在这里,只是简单地返回TRUE.
	*/
	virtual BOOL OnConnectionSubmiting(
		SMPPConnection & connection,
		PDU_SMPP_SUBMIT_SM _message
		)
	{
		return TRUE;
	}

	/**发送SUBMIT消息成功时调用 
	*/
	virtual void OnConnectionSubmited(
		SMPPConnection & connection,
		PDU_SMPP_SUBMIT_SM _message
		)
	{
		return;
	}

	/**发送SUBMIT消息失败时调用 
	*/
	virtual void OnConnectionSubmitFailed(
		SMPPConnection & connection,
		PDU_SMPP_SUBMIT_SM _message
		)
	{
		return;
	}

	/**收到CONNECT_RESPONSE时调用 
	*/
	virtual void OnReceivedConnectionConnectResponse(
		SMPPConnection & connection,
		PDU_SMPP_BIND_RESP _message
		)
	{
		return;;
	}

	/**收到Terminate消息时调用 
	*/
	virtual void OnReceivedConnectionTerminate(SMPPConnection & connection)
	{
		return;
	}

	/**收到SUBMIT_RESPONSE时调用 
	*/
	virtual void OnReceivedConnectionSubmitResponse(
		SMPPConnection & connection,
		PDU_SMPP_SUBMIT_SM_RESP _message
		)
	{
		return;
	}

	/**收到Deliver消息时调用 
	*/
	virtual void OnReceivedConnectionDeliver(
		SMPPConnection & connection,
		PDU_SMPP_DELIVER_SM _message
		)
	{
		return;
	}

	/**输出日志时调用
	格式化输出日志,默认是把内容//TRACE出来
	*/
	virtual void OnConnectionLogWrite(SMPPConnection & connection, const char * str);
	//@}

public:
	/**@name JobProcess functions */
	//@{
	BOOL ProcessConnectionSubmiting(
		SMPPConnection & connection,
		PDU_SMPP_SUBMIT_SM _message
		);

	void ProcessConnectionSubmited(
		SMPPConnection & connection,
		PDU_SMPP_SUBMIT_SM _message
		);

	void ProcessConnectionSubmitFailed(
		SMPPConnection & connection,
		PDU_SMPP_SUBMIT_SM _message
		);

	void ProcessReceivedConnectionConnectResponse(
		SMPPConnection & connection,
		PDU_SMPP_BIND_RESP _message
		);

	void ProcessReceivedConnectionTerminate(SMPPConnection & connection);

	void ProcessReceivedConnectionSubmitResponse(
		SMPPConnection & connection,
		PDU_SMPP_SUBMIT_SM_RESP _message
		);

	void ProcessReceivedConnectionDeliver(
		SMPPConnection & connection,
		PDU_SMPP_DELIVER_SM _message
		);

protected:
	/**创建一个连接token 
	*/
	const char * CreateToken() const;

	/**找到第一个可用的连接 
	*/
	SMPPConnection * firstFitRouter(int start);

	/**循环使用可用的连接 
	*/
	SMPPConnection * roundRobinRouter();

	/**记录Client日志信息和connection日志信息,默认将所有信息发送到调试窗口(Debug模式下) 
	*/
	virtual void LogWrite(const char * pchFmt, ...);

private:
	CThreadPool				m_pool;
	CWorkerSmpp						m_worker;
	CJobSmpp							* m_pJob;
	aList							connectionList;
	MyCriticalSection	m_listCS;
	SMPPConnection		* lastPick;
	int								m_nMinWorkThreadsCount;
	int								m_nMaxWorkThreadsCount;
	BOOL							m_fStarted;

	long							submitCountTotal;
	long							submitSucceedCountTotal;
	long							submitFailedCountTotal;
	long							respSucceedCountTotal;
	long							respFailedCountTotal;
	long							deliverCountTotal;
};

#endif

⌨️ 快捷键说明

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