?? sgip.h
字號(hào):
//*************************************************************************************************************// 文件名稱: SGIP.h// 實(shí)現(xiàn)功能: 中國(guó)聯(lián)通短消息業(yè)務(wù)聯(lián)網(wǎng)協(xié)議1.2版(sgip1.2 最新0213升級(jí)版)頭文件.// 文件作者: PrinceToad(范圣剛,北京風(fēng)起水流軟件工作室)// 軟件聲明: 免費(fèi)提供SP短消息網(wǎng)關(guān)開發(fā)接口庫(kù)下載使用(CMPP3.0,SGIP1.2,CMPP2.0)// Used Free,SourceCode On Sale!// 聯(lián)系方式:
// Homepage:Http://www.zealware.com
// MSN: princetoad2003@hotmail.com
// OICQ: 50506711
// Email: princetoad@zealware.com
// PhoneNo:010-13901168061// 軟件版本:
// V1.4 Jul.19.04
// 1.修正了一個(gè)返回函數(shù)指針錯(cuò)誤的問題。.(Special Thanks mate.)
// 2.增加了了程序啟動(dòng)模式,在Start函數(shù)里,當(dāng)指定nLocalPort = -1時(shí),不建立本地監(jiān)聽,只執(zhí)行發(fā)送模塊;
// 當(dāng)指定nPeerPort = -1時(shí),只進(jìn)行監(jiān)聽,接收MO消息,不建立同網(wǎng)關(guān)的連接.
// V1.36 Jun.07.04
// 1.修改了多連接分配時(shí)候的一個(gè)Bug,該Bug能夠?qū)е略诹髁勘容^大的時(shí)候丟失MT消息。
// 2.去除了除試用版過期的以外的其他消息提示對(duì)話框。
// 3.Start函數(shù)里面加了一個(gè)參數(shù)fOutputDebugInfo,用來(lái)指示是否輸出調(diào)試信息,
// 如果輸出的話,DLL會(huì)在當(dāng)前目錄下建立一個(gè)文本文件debug.log,輸出DLL的相關(guān)信息,
// 用作調(diào)試,出現(xiàn)錯(cuò)誤情況時(shí)可以查看該文件。
// V1.34 Apr.13.04
// 1.修改了接收超時(shí)導(dǎo)致丟失MO消息的問題。
// V1.33 Mar.30.04
// 1.根據(jù)聯(lián)通的最新修改,LinkId字段不作為兩個(gè)整數(shù)來(lái)處理,直接作為8字節(jié)的字符串處理。
// V1.32 Mar.23.04
// 1.修改了連接中斷后,重連的一個(gè)Bug.
// V1.3 Mar.07.04
// 1.修改了MT消息的發(fā)送方式,發(fā)送方式由原來(lái)的短連接(即一條消息建立一次連接)改為
// 現(xiàn)在的長(zhǎng)連接,提高了發(fā)送效率,減輕了網(wǎng)關(guān)負(fù)擔(dān)。
// 2.Start()函數(shù)增加了一個(gè)參數(shù),允許用戶自定義同網(wǎng)關(guān)建立的連接數(shù),默認(rèn)是3
// (網(wǎng)關(guān)連接數(shù)最好不要超過數(shù)值N, N = CPU個(gè)數(shù)*2 + 2)。
// V1.28 Feb.26.04
// 1.還是根據(jù)《SGIPV1.2協(xié)議適應(yīng)性修改0120(SP分冊(cè))》作了相應(yīng)修改。
// 2.根據(jù)協(xié)議變更,修改了Submit, Deliver, deliverstr結(jié)構(gòu)體的定義,增加或者修改了Reserved,linkid字段。
// 3.修改了MO,MT消息收發(fā)函數(shù).
// V1.27 Feb.16.04// 1.根據(jù)《SGIPV1.2協(xié)議適應(yīng)性修改0120(SP分冊(cè))》作了相應(yīng)修改.// V1.26 Jan.27.04// 1.修正了MTError時(shí),mt_err結(jié)構(gòu)提沒有帶回DateTime的錯(cuò)誤。 // V1.25 Dec.22.03
// 1.在Submit函數(shù)中返回了submit消息包序列號(hào)中的時(shí)間戳(與Reponse和Report中的時(shí)間戳是對(duì)應(yīng)的),
// 通過時(shí)間戳與序列號(hào)的結(jié)合徹底解決了序列號(hào)唯一對(duì)應(yīng)的問題(哪怕是系統(tǒng)重新啟動(dòng)).
//
// V1.24 Dec.04.03
// 1.更正了在接收消息包時(shí)未給ReportStr中的nSubmitSeqId字段賦值的錯(cuò)誤。
// 2.更正了MTError返回時(shí)不能帶回序列號(hào)的問題.
// 3.在ReportStr字段中加入新的字段unsigned int nSubmitDateTime,用于保存更加詳細(xì)的Report內(nèi)容.
//
// V1.23 Nov.25.03
// 1.MTErrorStr和MTRespStr兩個(gè)消息結(jié)構(gòu)中增加一個(gè)sgipg_submit字段,用于返回其對(duì)應(yīng)的SUBMIT消
// 息包,即這兩個(gè)消息是由哪個(gè)SUBMIT包返回的,原因是SubmitResp包中并未包含開發(fā)者可能用到的必要信
// 息(如手機(jī)號(hào)碼等,雖然這些信息在Report消息里面包含的比較全面)。
//
// V1.21 Nov.08.03
// 1.增加了函數(shù)CSgip::AddUserNumber(),可以方便地進(jìn)行短消息群發(fā).
// 2.增加了函數(shù)CSgip::GetSubmitSeqId(),功能是獲得下一條submit消息的序列號(hào).
// 在調(diào)用Submit()函數(shù)前調(diào)用可以提前獲得將要發(fā)送的submit消息的序列號(hào),類推的話,
// 下一條submit消息的序列號(hào)將在上一條消息序列號(hào)的基礎(chǔ)上加3.這樣的話就可以提前給submit消息編號(hào),
// 然后等待submit_resp消息的到來(lái)。
// 3.CSgip::Submit()函數(shù)的原型由CSgip::Submit(sgipg_submit ss)變?yōu)?// CSgip::Submit(sgipg_submit ss, unsigned int &nSeq),輸出參數(shù)nSeq的作用是返回submit消息的序列號(hào).
//
// 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
/////////////////////////////////////////////////////////////////////////////////////////
//錯(cuò)誤碼定義
//
#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 //只有最后出錯(cuò)時(shí)要返回狀態(tài)報(bào)告.
#define NEED_STATUSREPORT 0x01 //無(wú)論最后是否成功都要返回狀態(tài)報(bào)告.
#define NO_STATUSREPORT 0x02 //不需要返回狀態(tài)報(bào)告.
#define CTRL_TYPE 0x03 //僅攜帶包月計(jì)費(fèi)信息,不下發(fā)給用戶.
#define MSG_FORMAT_ASCII 0x00 //純ASCII字符串
#define MSG_FORMAT_WRITE_CARD 0x03 //寫卡操作
#define MSG_FORMAT_BINARY 0x04 //二進(jìn)制編碼
#define MSG_FORMAT_UCS2 0x08 //UCS2編碼
#define MSG_FORMAT_GB 0x0F //GBK編碼
#define MSG_FORMAT_OTA 0xF6 //OTA操作時(shí)的編碼方式
#define TPPROTO_SMS 0X00 //普通短信的協(xié)議類型
#define TPPROTO_WRITE_CARD 0X7F //OTA操作時(shí)的協(xié)議類型
//
// 順序號(hào),也可以用整數(shù)數(shù)組表示.
//
struct sgipg_seqid {
unsigned int nSrcNodeNum; //源節(jié)點(diǎn)編號(hào)
unsigned int nDateTime; //日期時(shí)間,如:1120203225
unsigned int nSeqId; //流水號(hào)
};
typedef struct sgipg_seqid SGIPG_SEQID;
// Add by princetoad.(Feb.26.04 V1.28)
//
// LinkId結(jié)構(gòu)體(根據(jù)sgip1.2 0120修訂版修改,就是原來(lái)Submit,Deliver包中的char Reserved[8]字段)
//
//struct sgipg_linkid {
// unsigned int nLinkId1; // Linkid的前四個(gè)字節(jié)(整數(shù)1)
// unsigned int nLinkId2; // Linkid的前四個(gè)字節(jié)(整數(shù)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應(yīng)答包
//
struct sgipg_resp {
unsigned char cResult; //0:成功
char sReserved[8];
};
typedef struct sgipg_resp SGIPG_RESP;
// 無(wú)消息體
//sgip_unbind
//sgip_unbind_resp
//
//
// MT消息體
// V1.1 增加對(duì)群發(fā)的支持.
//
struct sgipg_submit {
char sSpNumber[21]; //sp的接入號(hào)碼
char sChargeNumber[21]; //付費(fèi)號(hào)碼
unsigned char cUserCount; //接收短消息的手機(jī)數(shù)量
char sUserNumber[21*100]; //接受該短消息的手機(jī)號(hào)
char sCorpId[5]; //企業(yè)代碼,0-99999
char sServiceType[10]; //業(yè)務(wù)代碼,由sp定義
unsigned char cFeeType; //計(jì)費(fèi)類型
char sFeeValue[6]; //該條短消息的收費(fèi)值,單位為分
char sGivenValue[6]; //贈(zèng)送用戶的話費(fèi),0-99999
unsigned char cAgentFlag; //代收費(fèi)標(biāo)志,0:應(yīng)收;1:實(shí)收
unsigned char cMorelatetoMTFlag; //引起MT消息的原因
unsigned char cPriority; //優(yōu)先級(jí)0-9,從低到高
char sExpireTime[16]; //短消息壽命的終止時(shí)間,"yymmddhhmmsstnnp","tnnp"取固定值"032+"
char sScheduleTime[16]; //定時(shí)發(fā)送時(shí)間
unsigned char cReportFlag; //狀態(tài)報(bào)告標(biāo)志,0-出錯(cuò)返回狀態(tài)報(bào)告;1-總返回狀態(tài)報(bào)告;2-不要狀態(tài)報(bào)告;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; //短消息長(zhǎng)度(不調(diào)用sgip_submit_sm_set_messagecontent,而手動(dòng)賦值的話,需要調(diào)用函數(shù)htonl()轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序)
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; // 原來(lái)的保留字段,現(xiàn)在作為L(zhǎng)inkId使用,只需要把對(duì)應(yīng)的MO包中的字段拷過來(lái)即可(不用做轉(zhuǎn)換).
char sLinkId[8];
};
typedef struct sgipg_submit SGIPG_SUBMIT;
//
// DELIVER消息體
//
struct sgipg_deliver {
char sUserNumber[21]; //發(fā)送短消息的用戶手機(jī)號(hào)
char sSpNumber[21]; //sp的接入號(hào)碼
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; // 原來(lái)的保留字段,現(xiàn)在作為L(zhǎng)inkId使用,由業(yè)務(wù)鑒權(quán)中心生成.
char sLinkId[8];
};
typedef struct sgipg_deliver SGIPG_DELIVER;
//
// REPORT消息體
//
struct sgipg_report {
sgipg_seqid nSubmitSeqNum; //該命令所涉及的Submit或Deliver命令的序列號(hào)
unsigned char cReportType; //Report命令類型.0,1.
char sUserNumber[21]; //接收短消息的手機(jī)號(hào),手機(jī)號(hào)碼前加"86"國(guó)別標(biāo)志.
unsigned char cState; //該命令所涉及的短消息的當(dāng)前執(zhí)行狀態(tài).0:發(fā)送成功.1:等待發(fā)送.2:發(fā)送失敗.
unsigned char cErrorCode; //當(dāng)State==2時(shí)為錯(cuò)誤碼值,否則為0.
char sReserved[8]; //保留,擴(kuò)展用.
};
typedef struct sgipg_report SGIPG_REPORT;
//
// sgip_packet接收時(shí)用到的消息包.
//
struct sgipg_packet {
sgipg_head pk_head;
union{
sgipg_connect pk_login; //登錄包
sgipg_resp pk_resp; //應(yīng)答消息包
sgipg_submit pk_submit; //Submit消息包
sgipg_deliver pk_deliver; //Deliver消息包
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -