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

📄 cngpconn.h

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

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

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

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

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

	/**得到收到的StatusReport消息数 
	*/
	//##ModelId=46B5D4380024
	long GetStatusReportCount() const
	{	return sreportCountTotal;		}
	//@}

	/**@name Main Functions */
	//@{
	/**创建一个连接token 
	*/
	//##ModelId=46B5D4380026
	const char * CreateToken() const;

	//virtual void DumpStatus();

	/**初始化Client函数.
	注意: 每个Client在进行所有操作之前必须调用Initialize()进行初始化操作
	*/
	//##ModelId=46B5D438004C
	void Initialize(
		unsigned nMinWorkThreadsCount = 4,
		unsigned nMaxWorkThreadsCount = 8,
		unsigned short nListenPort = 11357
		);

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

	/**建立一个连接 
	*/
	//##ModelId=46B5D4380088
	CNGPConnection * MakeConnection(
		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
		);

	/**停止网关服务
	 */
	//##ModelId=46B5D4380100
	virtual void Release();

	/**清除连接 
	*/
	//##ModelId=46B5D438011E
	void ClearConnection(const char * token);

	/**清除当前Client中的所有连接 
	*/
	//##ModelId=46B5D438013C
	void ClearAllConnections();

	/**找到第一个可用的连接 
	*/
	//##ModelId=46B5D4380150
	CNGPConnection * firstFitRouter(int start);

	/**循环使用可用的连接 
	*/
	//##ModelId=46B5D4380164
	CNGPConnection * roundRobinRouter();

	/**发送一条Submit消息 
	*/
	//##ModelId=46B5D4380182
	int Submit(cngp_submit & message);
	//@}

	/**@name Callback functions */
	//@{
	/**登录网关成功时调用 
	*/
	//##ModelId=46B5D4380196
	virtual void OnConnectionLogined(CNGPConnection & connection) {
		return;
	}

	/**登录网关失败时调用 
	*/
	//##ModelId=46B5D43801A1
	virtual void OnConnectionLoginFailed(
		CNGPConnection & connection,
		int errorCode
		) {
		return;
	}

	/**同网关连接断开时调用 
	*/
	//##ModelId=46B5D43801AA
	virtual void OnConnectionCleared(CNGPConnection & connection) {
		return;
	}

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

	/**发送SUBMIT消息成功时调用 
	*/
	//##ModelId=46B5D43801BE
	virtual void OnConnectionSubmited(
		CNGPConnection & connection,
		cngp_submit _message
		) {
		return;
	}

	/**发送SUBMIT消息失败时调用 
	*/
	//##ModelId=46B5D43801C2
	virtual void OnConnectionSubmitFailed(
		CNGPConnection & connection,
		cngp_submit _message
		) {
		return;
	}

	/**收到CONNECT_RESPONSE时调用 
	*/
	//##ModelId=46B5D43801CB
	virtual void OnReceivedConnectionConnectResponse(
		CNGPConnection & connection,
		cngp_login_resp _message
		) {
		return;;
	}

	/**收到Terminate消息时调用 
	*/
	//##ModelId=46B5D43801D5
	virtual void OnReceivedConnectionTerminate(CNGPConnection & connection) {
		return;
	}

	/**收到SUBMIT_RESPONSE时调用 
	*/
	//##ModelId=46B5D43801DD
	virtual void OnReceivedConnectionSubmitResponse(
		CNGPConnection & connection,
		cngp_submit_deliver_resp _message
		) {
		return;
	}

	/**收到Deliver消息时调用 
	*/
	//##ModelId=46B5D43801E6
	virtual void OnReceivedConnectionDeliver(
		CNGPConnection & connection,
		cngp_deliver _message
		) {
		return;
	}

	/**收到STATUS_REPORT时调用 
	*/
	//##ModelId=46B5D43801F0
	virtual void OnReceivedConnectionStatusReport(
		CNGPConnection & connection,
		cngp_deliver _message
		) {
		return;
	}

	/**收到活动测试消息时调用 
	*/
	//##ModelId=46B5D43801FA
	virtual void OnReceivedConnectionActiveTest(CNGPConnection & connection) {
		return;
	}

	/**收到活动测试回复消息时调用 
	*/
	//##ModelId=46B5D43801FD
	virtual void OnReceivedConnectionActiveTestResponse(CNGPConnection & connection) {
		return;
	}

	/**输出日志时调用
	格式化输出日志,默认是把内容//TRACE出来
	*/
	//##ModelId=46B5D4380205
	virtual void OnConnectionLogWrite(CNGPConnection & connection, const char * str);

	///** 当没有可用连接时调用
	//*/
	////##ModelId=46B5D438022C
	//virtual void OnNoAvailableConnection( cngp_submit & _message ) {
	//	::InterlockedIncrement((long*)&submitFailedCountTotal);
	//	return;
	//}
	//@}
  
  BOOL IsBusy();

public:
	/**@name JobProcess functions */
	//@{
	/**发送SUBMIT消息前调用,如果返回失败,则停止发送SUBMIT消息.
	在这里,只是简单地返回TRUE.
	*/
	//##ModelId=46B5D4380236
	BOOL ProcessConnectionSubmiting(
		CNGPConnection & connection,
		cngp_submit _message
		);

	/**发送SUBMIT消息成功时调用 
	*/
	//##ModelId=46B5D438024A
	void ProcessConnectionSubmited(
		CNGPConnection & connection,
		cngp_submit _message
		);

	/**发送SUBMIT消息失败时调用 
	*/
	//##ModelId=46B5D438025E
	void ProcessConnectionSubmitFailed(
		CNGPConnection & connection,
		cngp_submit _message
		);

	/**收到CONNECT_RESPONSE时调用 
	*/
	//##ModelId=46B5D4380272
	void ProcessReceivedConnectionConnectResponse(
		CNGPConnection & connection,
		cngp_login_resp _message
		);

	/**收到Terminate消息时调用 
	*/
	//##ModelId=46B5D4380290
	void ProcessReceivedConnectionTerminate(CNGPConnection & connection);

	/**收到SUBMIT_RESPONSE时调用 
	*/
	//##ModelId=46B5D43802A4
	void ProcessReceivedConnectionSubmitResponse(
		CNGPConnection & connection,
		cngp_submit_deliver_resp _message
		);

	/**收到Deliver消息时调用 
	*/
	//##ModelId=46B5D43802B8
	void ProcessReceivedConnectionDeliver(
		CNGPConnection & connection,
		cngp_deliver _message
		);

	/**收到STATUS_REPORT时调用 
	*/
	//##ModelId=46B5D43802CC
	void ProcessReceivedConnectionStatusReport(
		CNGPConnection & connection,
		cngp_deliver _message
		);

	/**收到活动测试消息时调用 
	*/
	//##ModelId=46B5D43802E1
	void ProcessReceivedConnectionActiveTest(CNGPConnection & connection);

	/**收到活动测试回复消息时调用 
	*/
	//##ModelId=46B5D43802F5
	void ProcessReceivedConnectionActiveTestResponse(CNGPConnection & connection);

	//##ModelId=46B5D4380309
	unsigned short GetLocalPort() {
		long returnPort = ::InterlockedIncrement((long*)&ushLocalPort);
		if (returnPort - ushLocalPort > 1000) {
			ushLocalPort -= 1000;
		}

		return 	(unsigned short)returnPort;
	}

protected:
	//##ModelId=46B5D438030B
	CThreadPool       m_pool;
	//##ModelId=46B5D4380316
	CWorkerCngp       m_worker;
	//##ModelId=46B5D438031E
	CJobCngp          * m_pJob;
	//##ModelId=46B5D4380332
	aList             connectionList;
	//##ModelId=46B5D438033C
	MyCriticalSection listLock;
	//##ModelId=46B5D4380341
	CNGPConnection    * lastPick;
	//##ModelId=46B5D4380345
	int               m_nMinWorkThreadsCount;
	//##ModelId=46B5D438034F
	int	              m_nMaxWorkThreadsCount;
	//##ModelId=46B5D4380350
	BOOL              m_fStarted;   ///< 线程池是否已经启动
	//##ModelId=46B5D4380359
	BOOL              m_fExceeded;

	//##ModelId=46B5D4380363
	long submitCountTotal;			///< 提交的SUBMIT消息数
	//##ModelId=46B5D438036D
	long submitSucceedCountTotal;	///< SUBMIT发送成功消息数
	//##ModelId=46B5D438036E
	long submitFailedCountTotal;	///< SUBMIT发送失败消息数
	//##ModelId=46B5D4380377
	long respSucceedCountTotal;		///< 收到的成功的submitresponse消息数
	//##ModelId=46B5D4380381
	long respFailedCountTotal;		///< 收到的失败的submitresponse消息数
	//##ModelId=46B5D438038B
	long deliverCountTotal;			///< 收到的Deliver消息数
	//##ModelId=46B5D438038C
	long sreportCountTotal;			///< 状态报告数

	//##ModelId=46B5D4380395
	long ushLocalPort;				///< 本地监听起始端口
};

class CNGPServer;

/**
* CJob_CngpServer
*/
//##ModelId=46B5D43803BD
class CJob_CngpServer : public IJobDesc {
public:
	//##ModelId=46B5D43803C8
	CJob_CngpServer(
		cngp_sptosmg _message,
		CNGPServer	& _server, 
		JobType _type
		);

	//##ModelId=46B5D43803D3
	~CJob_CngpServer();

	//##ModelId=46B5D43803DB
	void OnSPMsg();

	//##ModelId=46B5D43803DD
	JobType type;

protected:
	//##ModelId=46B5D43803E6
	CNGPServer & server;
	//##ModelId=46B5D4390008
	cngp_sptosmg spMsg;
	//##ModelId=46B5D439000C
	int	nResult;
};

//##ModelId=46B5D439001B
class CWorker_CngpServer : public IWorker {
	//##ModelId=46B5D4390026
	virtual void ProcessJob( IJobDesc* pJobDesc );
};

//##ModelId=46B5D4390039
struct cngpsrvthread_param {
	//##ModelId=46B5D4390045
	CNGPServer* csServer;
	//##ModelId=46B5D439004E
	TCPSocket*	tsClient;
};

/** CNGP服务端实现
*/
//##ModelId=46B5D43900ED
class CNGPServer : public CCngp {
public:
	//##ModelId=46B5D43900F8
	TCPSocket	m_TsServer;        ///< Server端SOCKET句柄
	//##ModelId=46B5D43900FC
	int         m_nLocalPort;      ///< 本地监听端口
	//##ModelId=46B5D4390101
	char		m_sLocalAddr[16];  ///< 本地监听地址
	//##ModelId=46B5D439010B
	bool		m_fStop;           ///< 是否停止系统
	//##ModelId=46B5D439010C
	int			m_nSocketTimeout;  ///< SOCKET超时时间
	//##ModelId=46B5D4390116
	client_conn	conn_list[255];    ///< 客户端连接列表
	//##ModelId=46B5D439011F
	int			m_nConnectTotal;   ///< 客户端连接数
	//##ModelId=46B5D4390120
	HANDLE		m_hThread;         ///< 
	//##ModelId=46B5D4390129
	BOOL		m_fStarted;        ///< 服务端是否启动

	//##ModelId=46B5D4390133
	virtual void OnReceivedSPMessage( CNGP_SPTOSMG css ) {
		return;
	}

	//##ModelId=46B5D4390136
	virtual BOOL OnLogin( 
		cngp_login & login_message,       ///< 接收到的CNGP_LOGIN消息
		const char * clientAddress,       ///< 客户端的IP地址
		char * spid                       ///< 如果鉴权成功,返回该用户的接入号
		) 
	{
		return TRUE;
	}

	//##ModelId=46B5D4390148
	CThreadPool	        m_pool;
	//##ModelId=46B5D439014D
	CWorker_CngpServer  m_worker;
	//##ModelId=46B5D439015C
	CJob_CngpServer     * m_pJob;

protected:
	//##ModelId=46B5D4390160
	int LocalListen();

	//##ModelId=46B5D439016F
	static DWORD WINAPI CngpServFunc( LPVOID pParam );
	//##ModelId=46B5D4390179
	virtual DWORD CngpServProc();

	//##ModelId=46B5D439018D
	static DWORD WINAPI CngpClientFunc( LPVOID pParam );
	//##ModelId=46B5D43901A1
	virtual DWORD CngpClientProc( TCPSocket* tsClient );


	//##ModelId=46B5D43901AC
	int RecvSPMsg( 
		TCPSocket * tsClient,
		cngp_sptosmg * css, 
		unsigned & nResult 
		);

	//##ModelId=46B5D43901C0
	SOCKET GetFromList( const char * sIcpid );
	//##ModelId=46B5D43901CB
	void RemoveFromList( SOCKET hClient );
	//##ModelId=46B5D43901DE
	void AddToList(
		SOCKET hClient, 
		const char * sIcpid, 
		const char * sSpid, 
		ConnectionType type
		);

	//##ModelId=46B5D43901FC
	bool IsLogined(
		const char * sSpId, 
		SOCKET &hSock
		);

	//##ModelId=46B5D4390207
	virtual void OnLogWrite( const char * fmt, ... );
public:
	//##ModelId=46B5D4390224
	CNGPServer();
	//##ModelId=46B5D4390238
	~CNGPServer();

	//##ModelId=46B5D4390242
	void CreateCngpMsgID( unsigned seqid, unsigned char * msgid );

	//##ModelId=46B5D439024D
	int Start(
		const char     * server_addr, 
		unsigned short ushServport, 
		int            nSocketTimeout
		);

	//##ModelId=46B5D4390260
	void Release();

	//##ModelId=46B5D439026A
	int Deliver(
		char          * sMsgId, 
		unsigned char isReport,
		unsigned char uchMsgFmt, 
		char          * recvTime,
		char          * srcTermID, 
		char          * dstTermID, 
		unsigned char uchMsgLength, 
		char          * pchMsgContent
		);
};

#endif

⌨️ 快捷键说明

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