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

📄 sgip.h

📁 中国联通SGIP1.2短消息网关开发接口库.rar
💻 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@zealware.com
//				PhoneNo:010-13901168061//	软件版本:
//				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
//
//**************************************************************************************************************
#if !defined(AFX_SGIP_H__3164D539_D12F_4413_B519_24C91E94101E__INCLUDED_)
#define AFX_SGIP_H__3164D539_D12F_4413_B519_24C91E94101E__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#ifdef SGIP_IMPORT
#define	SGIP_API __declspec(dllimport)
#else
#define	SGIP_API __declspec(dllexport)
#endif

#include <afxwin.h>         // MFC core and standard components
#include <afxmt.h>			//CCriticalSection
#include <afxtempl.h>		//CMap, CList
#include "ThreadPool.h"

#include <winsock2.h>

#pragma comment(lib, "ws2_32")

#pragma pack(1)

class CSgip;

static unsigned int G_nSeq = 0;

#define	SGIP_SEND_TIMEOUT	3
#define SGIP_RECV_TIMEOUT	30

/////////////////////////////////////////////////////////////////////////////////////////
//错误码定义
//
#define		SGIP_SUCCESS					0							/*success*/
#define		SGIP_ERROR_START				0x40000000				
#define		SGIP_EINVALSOCK					SGIP_ERROR_START+1			/*create socket fail*/
#define		SGIP_EINVAL						SGIP_ERROR_START+2			/*illegal server address*/
#define		SGIP_HOST_UNREACHABLE			SGIP_ERROR_START+3			/*fail to connect isc*/
#define		SGIP_TIMEOUT					SGIP_ERROR_START+4			/*send or recv timeout*/
#define		SGIP_USERINVAL					SGIP_ERROR_START+5			/*user or pwd illegal*/
#define		SGIP_DISCONNECT					SGIP_ERROR_START+6			/*connection end*/
#define		SGIP_TOOHIGH_VERSION			SGIP_ERROR_START+9			/*too high version*/
/*SOCKET ERROR*/
#define		SGIP_SOCKET_CREATEFAIL			SGIP_ERROR_START+100
#define		SGIP_SOCKET_CONNECTFAIL			SGIP_ERROR_START+101
#define		SGIP_SOCKET_SENDTIMEOUT			SGIP_ERROR_START+102
#define		SGIP_SOCKET_SENDERROR			SGIP_ERROR_START+103
#define		SGIP_SOCKET_CLOSED				SGIP_ERROR_START+104
#define		SGIP_SOCKET_RECVTIMEOUT			SGIP_ERROR_START+105
#define		SGIP_SOCKET_RECVERROR			SGIP_ERROR_START+106
#define		SGIP_CLOSESOCKET_ERROR			SGIP_ERROR_START+107
#define		SGIP_UNSENDALL					SGIP_ERROR_START+108
#define		SGIP_SOCKET_SIZE_ERROR			SGIP_ERROR_START+109
#define		SGIP_ILLEGAL_CMD				SGIP_ERROR_START+110
#define		SGIP_LOGINFAIL					SGIP_ERROR_START+111
#define		SGIP_SOCKET_BINDFAIL			SGIP_ERROR_START+112
#define		SGIP_SOCKET_ACCEPTFAIL			SGIP_ERROR_START+113
#define		SGIP_API_EXCEPTION				SGIP_ERROR_START+200
#define		SGIP_SOCKET_EXCEPTION			SGIP_ERROR_START+300
#define		SGIP_API_INVALPARAM				SGIP_ERROR_START+400
#define		SGIP_SOCKET_INVALPARAM			SGIP_ERROR_START+500
//
/////////////////////////////////////////////////////////////////////////////////////////


//
//
//	消息ID定义
//
#define	SGIP_BIND				0x1		
#define SGIP_BIND_RESP			0x80000001		
#define SGIP_UNBIND				0x2		
#define SGIP_UNBIND_RESP		0x80000002		
#define SGIP_SUBMIT				0x3		
#define SGIP_SUBMIT_RESP		0x80000003		
#define SGIP_DELIVER			0x4		
#define SGIP_DELIVER_RESP		0x80000004
#define	SGIP_REPORT				0x5
#define	SGIP_REPORT_RESP		0x80000005

#define	ERR_STATUSREPORT		0x00		//只有最后出错时要返回状态报告.
#define	NEED_STATUSREPORT		0x01		//无论最后是否成功都要返回状态报告.
#define	NO_STATUSREPORT			0x02		//不需要返回状态报告.
#define	CTRL_TYPE				0x03		//仅携带包月计费信息,不下发给用户.

#define	MSG_FORMAT_ASCII		0x00		//纯ASCII字符串
#define	MSG_FORMAT_WRITE_CARD	0x03		//写卡操作
#define	MSG_FORMAT_BINARY		0x04		//二进制编码
#define	MSG_FORMAT_UCS2			0x08		//UCS2编码
#define	MSG_FORMAT_GB			0x0F		//GBK编码
#define	MSG_FORMAT_OTA			0xF6		//OTA操作时的编码方式

#define	TPPROTO_SMS				0X00		//普通短信的协议类型
#define	TPPROTO_WRITE_CARD		0X7F		//OTA操作时的协议类型

//
//	顺序号,也可以用整数数组表示.
//
struct sgipg_seqid {
	unsigned int	nSrcNodeNum;	//源节点编号
	unsigned int	nDateTime;		//日期时间,如:1120203225
	unsigned int	nSeqId;			//流水号
};
typedef struct sgipg_seqid	SGIPG_SEQID;

// Add by princetoad.(Feb.26.04 V1.28)
//
//	LinkId结构体(根据sgip1.2 0120修订版修改,就是原来Submit,Deliver包中的char Reserved[8]字段)
//
//struct sgipg_linkid {
//	unsigned int nLinkId1;		// Linkid的前四个字节(整数1)
//	unsigned int nLinkId2;		// Linkid的前四个字节(整数2)
//};
//typedef struct sgipg_linkid	SGIPG_LINKID;

//
//	消息头
//
struct sgipg_head {
	unsigned int	nTotalLength;
	unsigned int	nCommandId;
	sgipg_seqid		nSequenceId;
};
typedef	struct sgipg_head	SGIPG_HEAD;

//
//	登录包消息体
//
struct sgipg_connect {
	unsigned char	cLoginType;			//1-sp连接smg;2-smg连接sp
	char			sLoginName[16];
	char			sLoginPwd[16];
	char			sReserved[8];
};
typedef struct sgipg_connect SGIPG_CONNECT;

//
//	SGIP1.2应答包
//
struct sgipg_resp {
	unsigned char	cResult;		//0:成功
	char			sReserved[8];
};
typedef struct sgipg_resp SGIPG_RESP;

//	无消息体
//sgip_unbind		
//sgip_unbind_resp
//

//
//	MT消息体
//	V1.1	增加对群发的支持.
//
struct sgipg_submit {
	char			sSpNumber[21];				//sp的接入号码
	char			sChargeNumber[21];			//付费号码
	unsigned char	cUserCount;					//接收短消息的手机数量
	char			sUserNumber[21*100];		//接受该短消息的手机号
	char			sCorpId[5];					//企业代码,0-99999
	char			sServiceType[10];			//业务代码,由sp定义
	unsigned char	cFeeType;					//计费类型
	char			sFeeValue[6];				//该条短消息的收费值,单位为分
	char			sGivenValue[6];				//赠送用户的话费,0-99999
	unsigned char	cAgentFlag;					//代收费标志,0:应收;1:实收
	unsigned char	cMorelatetoMTFlag;			//引起MT消息的原因
	unsigned char	cPriority;					//优先级0-9,从低到高
	char			sExpireTime[16];			//短消息寿命的终止时间,"yymmddhhmmsstnnp","tnnp"取固定值"032+"
	char			sScheduleTime[16];			//定时发送时间
	unsigned char	cReportFlag;				//状态报告标志,0-出错返回状态报告;1-总返回状态报告;2-不要状态报告;3...
	unsigned char	cTpPid;
	unsigned char	cUdhi;
	unsigned char	cMessageCoding;				//编码方式,0:Ascii;3:Write card;4:binary;8:ucs2;15:GBK
	unsigned char	cMessageType;				//0:短消息信息
	unsigned int	nMsgLen;					//短消息长度(不调用sgip_submit_sm_set_messagecontent,而手动赋值的话,需要调用函数htonl()转换为网络字节序)
	unsigned char	sMsgContent[160];			//160;
// Edit by princetoad.(Feb.26.04 V1.28)
//	char			sReserved[8];
// Edit by princetoad.(Mar.30.04 V1.33)
//	sgipg_linkid	stLinkId;					// 原来的保留字段,现在作为LinkId使用,只需要把对应的MO包中的字段拷过来即可(不用做转换).
	char			sLinkId[8];
};
typedef struct sgipg_submit	SGIPG_SUBMIT;

//
//	DELIVER消息体
//
struct sgipg_deliver {
	char			sUserNumber[21];			//发送短消息的用户手机号
	char			sSpNumber[21];				//sp的接入号码
	unsigned char	cTpPid;						//
	unsigned char	cUdhi;
	unsigned char	cMsgCoding;
	unsigned int	nMsgLen;
	unsigned char	sMsgContent[160];
// Edit by princetoad.(Feb.26.04 V1.28)
//	char			sReserved[8];
// Edit by princetoad.(Mar.30.04)
//	sgipg_linkid	stLinkId;					// 原来的保留字段,现在作为LinkId使用,由业务鉴权中心生成.
	char			sLinkId[8];
};
typedef struct sgipg_deliver	SGIPG_DELIVER;

//
//	REPORT消息体
//
struct sgipg_report {
	sgipg_seqid		nSubmitSeqNum;		//该命令所涉及的Submit或Deliver命令的序列号
	unsigned char	cReportType;		//Report命令类型.0,1.
	char			sUserNumber[21];	//接收短消息的手机号,手机号码前加"86"国别标志.
	unsigned char	cState;				//该命令所涉及的短消息的当前执行状态.0:发送成功.1:等待发送.2:发送失败.
	unsigned char	cErrorCode;			//当State==2时为错误码值,否则为0.
	char			sReserved[8];		//保留,扩展用.
};
typedef struct sgipg_report			SGIPG_REPORT;

//
//	sgip_packet接收时用到的消息包.
//
struct sgipg_packet {
	sgipg_head		pk_head;
	union{
		sgipg_connect			pk_login;			//登录包	
		sgipg_resp				pk_resp;			//应答消息包

		sgipg_submit			pk_submit;			//Submit消息包
		
		sgipg_deliver			pk_deliver;			//Deliver消息包

⌨️ 快捷键说明

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