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

📄 sgipapi.h

📁 用c++编写的的中国联通Sgip协议
💻 H
📖 第 1 页 / 共 2 页
字号:
//*************************************************************************************************************//	文件名称:	SGIP.h//	实现功能:	中国联通短消息业务联网协议1.2版(sgip1.2 最新0213升级版)头文件.//	文件作者:	PrinceToad(范圣刚,北京风起水流软件工作室)//	软件声明:	免费提供SP短消息网关开发接口库下载使用(CMPP3.0,SGIP1.2,CMPP2.0)//				Used Free,SourceCode On Sale!//	联系方式:	
//				Homepage:Http://www.zealware.com
//				MSN:	princetoad2003@hotmail.com
//				OICQ:	50506711
//				Email:	princetoad@gmail.com
//				PhoneNo:010-13901168061//	软件版本:
//				V1.61 May.07.06
//					1.修正了上行连接线程安全的一个Bug.
//
//				V1.6 Mar.25.06
//					1.加入了是否对网关登录SP的用户名口令进行验证的配置和参数。
//					2.加入了对网关连接SP的最大连接数进行配置的参数。
//					3.增加了输出调试日志的接口。
//					4.增加了允许设定线城池的工作线程数的参数配置。
//					5.支持输出SMG到网关的连接的连接数,SOCKET句柄,和远程端口(可以在外部关闭网关连接)。
//					6.回调函数返回值改为int.(允许在回调函数中返回值)
//					7.修正了一些BUG.
//				V1.42 Jul.30.04
//					1.不对SUBMIT消息的MSGCONTENT长度作限制,原来的长度限制160,现在只要整个消息包不超过2K就可以.
//				V1.41 Jul.30.04
//					1.加入了对MO连接远程服务器IP地址的判断,防止非法攻击!
//					2.彻底修正了MT断开重连,再发消息的Bug,MTRESP不会再返回255的错误.
//				V1.4  Jul.19.04
//					1.修正了一个返回函数指针错误的问题。.(Special Thanks mate.)
//					2.增加了了程序启动模式,在Start函数里,当指定nLocalPort = -1时,不建立本地监听,只执行发送模块;
//					  当指定nPeerPort = -1时,只进行监听,接收MO消息,不建立同网关的连接.
//				V1.36 Jun.07.04
//					1.修改了多连接分配时候的一个Bug,该Bug能够导致在流量比较大的时候丢失MT消息。
//					2.去除了除试用版过期的以外的其他消息提示对话框。
//					3.Start函数里面加了一个参数fOutputDebugInfo,用来指示是否输出调试信息,
//					  如果输出的话,DLL会在当前目录下建立一个文本文件debug.log,输出DLL的相关信息,
//					  用作调试,出现错误情况时可以查看该文件。
//				V1.34 Apr.13.04
//					1.修改了接收超时导致丢失MO消息的问题。
//				V1.33 Mar.30.04
//					1.根据联通的最新修改,LinkId字段不作为两个整数来处理,直接作为8字节的字符串处理。
//				V1.32 Mar.23.04
//					1.修改了连接中断后,重连的一个Bug.
//				V1.3  Mar.07.04
//					1.修改了MT消息的发送方式,发送方式由原来的短连接(即一条消息建立一次连接)改为
//					  现在的长连接,提高了发送效率,减轻了网关负担。
//					2.Start()函数增加了一个参数,允许用户自定义同网关建立的连接数,默认是3
//					  (网关连接数最好不要超过数值N, N = CPU个数*2 + 2)。
//				V1.28 Feb.26.04
//					1.还是根据《SGIPV1.2协议适应性修改0120(SP分册)》作了相应修改。
//					2.根据协议变更,修改了Submit, Deliver, deliverstr结构体的定义,增加或者修改了Reserved,linkid字段。
//					3.修改了MO,MT消息收发函数.
//				V1.27 Feb.16.04//					1.根据《SGIPV1.2协议适应性修改0120(SP分册)》作了相应修改.//				V1.26 Jan.27.04//					1.修正了MTError时,mt_err结构提没有带回DateTime的错误。	//				V1.25 Dec.22.03
//					1.在Submit函数中返回了submit消息包序列号中的时间戳(与Reponse和Report中的时间戳是对应的),
//					  通过时间戳与序列号的结合彻底解决了序列号唯一对应的问题(哪怕是系统重新启动).
//
//				V1.24 Dec.04.03
//					1.更正了在接收消息包时未给ReportStr中的nSubmitSeqId字段赋值的错误。
//					2.更正了MTError返回时不能带回序列号的问题.	
//					3.在ReportStr字段中加入新的字段unsigned int nSubmitDateTime,用于保存更加详细的Report内容.
//
//				V1.23 Nov.25.03
//					1.MTErrorStr和MTRespStr两个消息结构中增加一个sgipg_submit字段,用于返回其对应的SUBMIT消
//					 息包,即这两个消息是由哪个SUBMIT包返回的,原因是SubmitResp包中并未包含开发者可能用到的必要信
//					 息(如手机号码等,虽然这些信息在Report消息里面包含的比较全面)。
//
//				V1.21 Nov.08.03
//					1.增加了函数CSgip::AddUserNumber(),可以方便地进行短消息群发.
//					2.增加了函数CSgip::GetSubmitSeqId(),功能是获得下一条submit消息的序列号.
//					 在调用Submit()函数前调用可以提前获得将要发送的submit消息的序列号,类推的话,
//					 下一条submit消息的序列号将在上一条消息序列号的基础上加3.这样的话就可以提前给submit消息编号,
//					 然后等待submit_resp消息的到来。
//					3.CSgip::Submit()函数的原型由CSgip::Submit(sgipg_submit ss)变为
//					 CSgip::Submit(sgipg_submit ss, unsigned int &nSeq),输出参数nSeq的作用是返回submit消息的序列号.
//
//				V1.2  Sep.11.03
//
//**************************************************************************************************************
#ifndef _SMAL_SGIP_API_H
#define _SMAL_SGIP_API_H

#include <smal.h>
#include <common/threadpool.h>
#include <common/const.h>
#include <sgip/sgip_message.h>

#include <list>
using namespace std;

#pragma warning(disable : 4251)
#pragma warning(disable : 4018)

class CSgip;

///
/// SGIP JOB类
///
class CJobSgip : public IJobDesc {
public:
	CJobSgip(SOCKET &hSocket, CSgip* sgip, unsigned remoteport);
	CJobSgip(sgipg_submit pss, CSgip* sgip, unsigned int nSeq, unsigned int nDateTime);
	~CJobSgip();

	void	RecvMOProc();
	void	SendMTProc();
	int		nType;

private:
	sgip_conn			sp_conn;
	CSgip*				m_sgip;
	sgipg_submit	ss;
	unsigned			m_nSeq;
	unsigned			m_nDateTime;
};

///
///	SGIP WORK类
///
class CWorkerSgip : public IWorker {
	virtual void ProcessJob( IJobDesc* pJobDesc );
};

///
///	 网关连接信息
///
class ConnInfo {
public:
	ConnInfo() {
		socketHandle	= 0;
		port					= 0;
		connectedTime = _T("");
	}

	ConnInfo(
		unsigned	_socketHandle, 
		unsigned	_port,
		CString		_connectedTime
		) {
			socketHandle	= _socketHandle;
			port					= _port;
			connectedTime = _connectedTime;
		}

		unsigned	socketHandle;		///< 网关到SP的SOCKET句柄
		unsigned	port;						///< 网关的远程端口
		CString		connectedTime;	///< 网关到SP的连接连接时间
};

typedef std::list<ConnInfo>		cList;

///
///	SGIP协议封装类
///
class /*SGIP_API*/ CSgip{
	friend class CJobSgip;
public:
	/**@name Construction */
	//@{
	///
	///	构造函数,初始化WinSock,初始化变量值
	///
	CSgip();

	///
	///	析构函数,释放WinSock
	///
	virtual ~CSgip();
	
	//@}

	/**@name Main Functions */
	//@{
	/**
	* SGIPAPI启动主函数
	* 在这个函数里面启动本地监听,连接网关,和启动线城池。
	* 注意:
	* 1.在调用Start函数启动后,如果想重新调用Start函数,
	* 必须首先调用Release函数释放资源才能重新调用Start函数,否则会调用失败。
	* 2.可以通过设定nLocalPort=-1,或nPeerPort=-1实现收发分离功能。
	* 
	* @param sLocalIP					SGIP本地监听地址
	* @param nLocalPort				SGIP的本地监听端口(注意:如果设为-1则不启动本地监听,即不接收网关的连接和消息,只启用发送功能)
	* @param sPeerIP					联通网关地址
	* @param nPeerPort				联通网关端口(注意:如果设为-1,则不连接网关,即不执行发送功能,可以只接收MO消息)
	* @param sLoginName				登录联通网关的用户名
	* @param sLoginPwd				登录联通网关的口令
	* @param nConnType				登录网关的连接类型(按照协议规定,应该一直是1。<1:SP向SMG建立的连接,用于发送命令>)
	* @param sSrcNum					源节点编号(SP的编号规则:3AAAAQQQQQ AAAA表示四位长途区号,QQQQQ表示5位企业代码。详见协议3.3)
	* @param nConnCount				同网关建立的发送连接数
	* @param sPeerName				网关登录SP的用户名(如果用户名或者口令为空的话,则不对网关连接进行用户名口令鉴权)
	* @param sPeerPwd					网关登录SP的口令
	* @param nMaxSmgConn			允许的网关到SP的最大连接数
	* @param nMinWorkThreadsCount	线程池的最小线程数(即初始线程数,建议为CPU个数*2 + 2)
	* @param nMaxWorkThreadsCount	线程池的最大线程数(建议为CPU个数*2 + 6,线程池会根据忙碌状态在此范围内自动调整)
	*
	* @return	0:成功; -1:失败
	*/
	int Start(
		char			*sLocalIP, 
		int				nLocalPort,
		char			*sPeerIP, 
		int				nPeerPort, 
		char			*sLoginName, 
		char			*sLoginPwd, 
		int				nConnType, 
		char			*sSrcNum,
		int				nConnCount = 3, 
		char			*sPeerName = NULL,
		char			*sPeerPwd = NULL,
		unsigned	nMaxSmgConn = 16,
		unsigned	nMinWorkThreadsCount = 4,
		unsigned	nMaxWorkThreadsCount = 8
		);

	///
	/// 断开连接,停止线程池,释放资源
	///
	void Release(
		BOOL forceRelease = FALSE		///< 如果Start没有启动成功,是否强制释放
	);

	///
	/// 提交MT消息
	///	nDatetime(submit包的时间戳,序列号中的第二个字段),
	/// 与nSeq结合能够做到唯一标识一条submit消息(即使系统重新启动,nSeq重新归零).
	///
	void Submit(
		sgipg_submit	ss,						///< Submit消息包
		unsigned			&nSeq,				///< 该消息包的序列号中的序列号
		unsigned			&nDateTime		///< 该消息包的序列号中的时间戳
	);

	///
	///	支持群发的设置目的号码的函数.
	///	sUserNumber可以是单个的手机号码,或者以逗号,中划线隔开的多个号码.
	///	可以是以下几种类型之一,例如:"8613312345678",或"8613312345678,86133123456789",

⌨️ 快捷键说明

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