📄 sgip.h
字号:
//*************************************************************************************************************// 文件名称: 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 + -