?? ~sgipapi.~h
字號:
/**
* 文件名稱: SGIP.h
* 實現功能: 中國聯通短消息業務聯網協議1.2版(sgip1.2 最新0213升級版)頭文件.
* 文件作者: PrinceToad(范圣剛,北京風起水流軟件工作室)
* 軟件聲明: 免費提供SP短消息網關開發接口庫下載使用(CMPP3.0,SGIP1.2,CMPP2.0)
* 聯系方式:
* Homepage:Http://www.zealware.com
* MSN: princetoad2003@hotmail.com
* OICQ: 50506711
* Email: princetoad@gmail.com
* PhoneNo:010-13901168061
* 軟件版本:
* Revision V1.70 06/22/2007
* 1.采用類封裝方式實現SGIPAPI.
* 2.去掉了MFC類庫的使用.
*
* 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;
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;
memset(connectedTime, 0, MAX_PATH);
}
ConnInfo(
unsigned _socketHandle,
unsigned _port,
const char * _connectedTime
)
{
socketHandle = _socketHandle;
port = _port;
#if defined(_MSC_VER) && _MSC_VER >= 1400
strcpy_s(connectedTime, MAX_PATH, _connectedTime);
#else
strcpy(connectedTime, _connectedTime);
#endif
//strcpy(connectedTime, _connectedTime);
}
unsigned socketHandle; ///< 網關到SP的SOCKET句柄
unsigned port; ///< 網關的遠程端口
char connectedTime[MAX_PATH]; ///< 網關到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(
const char *sLocalIP,
int nLocalPort,
const char *sPeerIP,
int nPeerPort,
const char *sLoginName,
const char *sLoginPwd,
int nConnType,
const char *sSrcNum,
int nConnCount = 3,
const char *sPeerName = NULL,
const 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 ///< 該消息包的序列號中的時間戳
);
/////
///// 支持群發的設置目的號碼的函數.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -