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

📄 sgipapi.h

📁 用c++编写的的中国联通Sgip协议
💻 H
📖 第 1 页 / 共 2 页
字号:
	///	或"8613312345670-8613312345679",或"8613312345670,8613312345675-8613312345689",或"8613012345678,8613012345679-8613012345688,8613312312312"。
	///
	int AddUserNumber(
		sgipg_submit* ss,					///< 要群发的消息包
		const char* sUserNumber		///< 要增加的群发手机号
	);

	///
	/// 得到下一条要发submit消息的序列号
	///
	unsigned int GetSubmitSeqId();

	///
	///	得到当前网关到SP的连接信息
	///
	void GetSmgConnInfo(
		cList & _connList
	) {		
		_connList = connList; 
		return;		
	}

	///
	///	得到当前网关到SP的连接数
	//
	unsigned GetSmgConnCount()	{	return (unsigned)connList.size(); }

	//@}

	/**@name 消息处理虚函数 */
	//@{
	/**
	 * 收到DELIVER上行消息时调用该函数
	 */
	virtual int	OnDeliver(DeliverStr & deliver) {	
		return 0; 
	}

	/**
	 * 收到状态报告时调用该函数
	 */
	virtual int OnReport(ReportStr & report) {
		return 0; 
	}

	/**
	 * 收到Submit应答消息时调用此函数
	 */
	virtual int OnResponse(MTRespStr & response) {	
		return 0; 
	}

	/**
	 * 发送SUBMIT消息失败时调用该函数
	 *
	 * MT_Error的错误码描述:
	 * 1:因为连接不上SMG网关系统 2:登录网关失败 3:包发送失败且超过重发次数 4.超时无应答 5.消息长度为零 6.没有可用的连接
	 */
	virtual int OnMTError(MTErrorStr mterror) {	
		return 0; 
	}

	/**
	 * 记录日志函数
	 */
	virtual int	 OnLogWrite(const char* pchFmt, ...) {
		char buffer[1024] = "";

		va_list arglist;						
		va_start( arglist, pchFmt );
		_vsnprintf( buffer, 1024, pchFmt, arglist );
		va_end(arglist);

		TRACE(buffer);

		return 0; 
	}
	//@}

	/**@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;		}

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

protected:
	int SubmitFunc(sgipg_submit ss, unsigned int nSeq, unsigned int nDateTime);

	/**@name SetFunctions */
	//@{
	/**递增提交的SUBMIT消息数 
	*/
	long AddSubmitCount() {	
		return ::InterlockedIncrement((long*)&submitCountTotal);
	}

	/**递增发送成功的SUBMIT消息数 
	*/
	long AddSubmitSucceedCount() {	
		return ::InterlockedIncrement((long*)&submitSucceedCountTotal);
	}

	/**递增发送失败的SUBMIT消息数 
	*/
	long AddSubmitFailedCount() {
		return ::InterlockedIncrement((long*)&submitFailedCountTotal);
	}

	/**递增失败的SUBMITResponse消息数 
	*/
	long AddRespFailedCount() {
		return ::InterlockedIncrement((long*)&respFailedCountTotal);
	}

	/**递增成功的SUBMITResponse消息数 
	*/
	long AddRespSucceedCount() {	
		return ::InterlockedIncrement((long*)&respSucceedCountTotal);
	}

	/**递增收到的Deliver消息数 
	*/
	long AddDeliverCount() {
		return ::InterlockedIncrement((long*)&deliverCountTotal);
	}

	/**递增收到的StatusReport消息数 
	*/
	long AddStatusReportCount() {	
		return ::InterlockedIncrement((long*)&sreportCountTotal);
	}
	//@}
private:
	bool LocalListen();
	bool IsValidIPAddr(LPCTSTR sIPAddr);
	bool CreateLogFile();
	sgip_conn* GetSubmitConn(int &nConnIndex);
	void ChangeStatus(int nConnIndex, bool fBusy);
	int	 LoginSmg(sgip_conn *pConn);
	void LogoutSmg(sgip_conn *pConn);
	bool CreateConn();
	bool ReleaseConn();
	void AddSmgConn(unsigned socketHandle, unsigned port);
	void RemoveSmgConn(unsigned socketHandle);
	CString GetDateTime();
	unsigned GetMaxSmgConnections()	{	return m_nMaxSmgConn; }

private:
	static DWORD WINAPI SgipServFunc(LPVOID pParam);
	virtual DWORD SgipServProc();
	//int	 (*m_PDeliver)(DeliverStr  deliver);
	//int	 (*m_PReport)(ReportStr report);
	//int	 (*m_PResponse)(MTRespStr  response);
	/////
	///// MT_Error的错误码描述:
	///// 1:因为连接不上SMG网关系统 2:登录网关失败 3:包发送失败且超过重发次数 4.超时无应答 5.消息长度为零 6.没有可用的连接
	/////
	//int	 (*m_PMTError)(MTErrorStr mterror);
	//int	 (*OnLogWrite)(const char* pchFmt, ...);
	CString GetPeerName() {		return m_sPeerName;	}
	CString GetPeerPwd()	{		return m_sPeerPwd;	}

private:
	CString		m_sPeerAddr;			///< 网关IP地址
	int				m_nPeerPort;			///< 网关端口
	CString		m_sUserName;			///< 登录用户名
	CString		m_sPwd;						///< 登录口令
	int				m_nConnType;			///< 连接类型
	int				m_nSubmitConn;		///< SP到网关连接数
	CString		m_sSrcNum;				///< 原节点号码
	CString		m_sLocalIPAddr;		///< 本机地址
	int				m_nLocalPort;			///< 本地监听端口
	CString		m_sPeerName;			///< 网关登录SP的用户名
	CString		m_sPeerPwd;				///< 网关登录SP的口令
	unsigned	m_nMaxSmgConn;		///< 允许的网关到SP的最大连接数

	CString		m_sLogPath;				///< 日志文件路径
	//BOOL			m_fLogEvent;			///< 是否记录系统日志

	CThreadPool	pool;						///< 线程池
	CWorkerSgip	m_worker;
	CJobSgip		*m_pJob;
	unsigned		m_nMinWorkThreadsCount;	///< 线程池初始线程数
	unsigned		m_nMaxWorkThreadsCount;	///< 允许的线程池最大线程数

	BOOL				m_fStarted;			///< 是否已经启动
	BOOL				m_fStop;				///< 系统停止标志

	SOCKET			serverSocket;		///< 本地监听套接字
	HANDLE			m_hThread;			///< 本地监听线程的句柄

	unsigned		m_nCounter;			///< 消息的数量

	sgip_conn		SubmitConn[MAX_PATH];	///< SP到网关连接池
	CCriticalSection m_arrayCs;	///< 队列临界区
	int					m_nConnIndex;		///< 连接索引
	CCriticalSection m_listCs;
	cList				connList;				///< 网关连接队列

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

#endif // SGIP_API_H

⌨️ 快捷键说明

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