?? sgip.h
字號:
sgipg_connect pk_login; //登錄包
sgipg_resp pk_resp; //應答消息包
sgipg_submit pk_submit; //Submit消息包
sgipg_deliver pk_deliver; //Deliver消息包
sgipg_report pk_report; //Report消息包
}pk_data;
};
typedef struct sgipg_packet SGIPG_PACKET;
struct sgip_conn {
SOCKET hSocket;
unsigned int nSrcNum; //源節(jié)點編號
bool fBinded;
bool fBusy;
int nCount;
sgip_conn() {
fBinded = false;
hSocket = NULL;
fBusy = false;
nCount = 0;
}
};
typedef struct sgip_conn SGIP_CONN;
//
// 消息包長度定義
//
#define SGIP_HEADLEN sizeof(sgipg_head) //消息頭的長度
#define SGIP_LOGINLEN sizeof(sgipg_connect) //登錄消息包體的長度
#define SGIP_RESPLEN sizeof(sgipg_resp) //應答包體的長度
#define SGIP_SUBMITLEN sizeof(sgipg_submit) //MT消息體的長度
#define SGIP_DELIVERLEN sizeof(sgipg_deliver) //MO消息體的長度
#define SGIP_REPORTLEN sizeof(sgipg_report) //Report消息體的長度
//
/////////////////////////////////////////////////////////////////////////////////////////
//
//用于返回包
//
/////////////////////////////////////////////////////////////////////////////////////////
//Deliver包結構
typedef struct deliverstr
{
unsigned int nSrcNum;
unsigned int nDateTime;
unsigned int nSeq;
char sUserNumber[22];
char sSPNumber[22];
unsigned char tp_pid;
unsigned char tp_udhi;
unsigned char cMsgCoding;
unsigned int nMsgLen;
unsigned char sMsgContent[160];
char sLinkId[9];
}DeliverStr;
//Report包結構
typedef struct reportstr
{
unsigned int nSrcNum;
unsigned int nDateTime;
unsigned int nSeq;
char sUserNumber[22];
unsigned char cState;
unsigned char cErrcode;
unsigned int nSubmitSeq;
unsigned int nSubmitDateTime;
}ReportStr;
//MT Response結構
typedef struct mtrespstr
{
unsigned int nID;
unsigned int nSrcNum;
unsigned int nDateTime;
unsigned int nSeq;
unsigned char cResult;
sgipg_submit ss;
}MTRespStr;
//Submit錯誤結構,當Submit發(fā)送不成功時,返回該結構
typedef struct mterrorstr
{
unsigned int nID;
unsigned int nSrcNum;
unsigned int nDateTime;
unsigned int nSeq;
//1:因為連接不上SMG網關系統(tǒng) 2:登錄網關失敗 3:包發(fā)送失敗且超過重發(fā)次數 4.超時無應答 5.消息長度為零 6.沒有可用的連接
int nErrorType;
sgipg_submit ss;
}MTErrorStr;
//
//注:函數返回值零表示成功,其他表示失敗
//
/////////////////////////////////////////////////////////////////////////////////////////
//Winsock封裝
//
int sgip_create_tcp_socket(SOCKET &hSocket);
int sgip_socket_close(SOCKET& hSocket);
int sgip_socket_bind(SOCKET hSocket, int nPort);
int sgip_socket_accept(SOCKET hServer, SOCKET &hClient);
int sgip_socket_connect(SOCKET hSocket, const char *sServAddr, int nPort);
int sgip_socket_select_send(SOCKET hSocket, const char *sBuffer, int nSize, int nTimeOut);
int sgip_socket_select_recv(SOCKET hSocket, char *sBuffer, int nSize, int nTimeOut);
int sgip_socket_send(SOCKET hSocket, const char *sBuffer, int nSize);
int sgip_socket_recv(SOCKET hSocket, char *sBuffer, int nSize);
//
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
//協(xié)議實現
int sgip_connect_to_ismg(const char *sSrvAddr, int nPort, sgip_conn *conn);
int sgip_disconnect_from_ismg(sgip_conn *conn);
int sgip_login(sgip_conn* conn, sgipg_connect *sc, const char* sSrcNum, unsigned int nSeq);
int sgip_login_value_set(sgipg_connect *sc, int nLoginType, const char *sLoginName, const char *sLoginPwd);
int sgip_logout(sgip_conn* conn, unsigned int nSeq);
int sgip_submit(sgip_conn* conn, sgipg_submit* ss, unsigned int nSeq, unsigned int nDateTime);
int sgip_recv(sgip_conn* conn, sgipg_packet* sp, unsigned int nTimeOut);
int sgip_auto_resp(sgip_conn* conn, sgipg_head* sh, unsigned int nResult = 0);
int sgip_deliver(sgip_conn* conn, sgipg_deliver* sd);
int sgip_submit_sm_init(sgipg_submit* cs);
int sgip_submit_sm_set_spnumber(sgipg_submit* cs, const char* sSpNumber, unsigned int nSize);
int sgip_submit_sm_set_chargenumber(sgipg_submit* cs, const char* sChargeNumber, unsigned int nSize);
int sgip_submit_sm_set_usercount(sgipg_submit* cs, unsigned char cUserCount);
int sgip_submit_sm_set_usernumber(sgipg_submit* cs, const char *sUserNumber, unsigned int nSize);
int sgip_submit_sm_add_usernumber(sgipg_submit* cs, const char *sUserNumber);
int sgip_submit_sm_set_corpid(sgipg_submit* cs, const char* sCorpId, unsigned int nSize);
int sgip_submit_sm_set_servicetype(sgipg_submit* cs, const char* sServiceType, unsigned int nSize);
int sgip_submit_sm_set_feetype(sgipg_submit* cs, unsigned char cFeeType);
int sgip_submit_sm_set_feevalue(sgipg_submit* cs, const char* sFeeValue, unsigned int nSize);
int sgip_submit_sm_set_givenvalue(sgipg_submit* cs, const char* sGivenValue, unsigned int nSize);
int sgip_submit_sm_set_agentflag(sgipg_submit* cs, unsigned char cAgentFlag);
int sgip_submit_sm_set_morelatetomtflag(sgipg_submit* cs, unsigned char cMorelatetoMTFlag);
int sgip_submit_sm_set_priority(sgipg_submit* cs, unsigned char cPriority);
int sgip_submit_sm_set_expiretime(sgipg_submit* cs, unsigned int nValidMinutes);
int sgip_submit_sm_set_schuduletime(sgipg_submit* cs, const char* sSchuduleTime);
int sgip_submit_sm_set_reportflag(sgipg_submit* cs, unsigned char cReportFlag);
int sgip_submit_sm_set_protoid(sgipg_submit* cs, unsigned char cTpPid, unsigned char cTpUdhi);
int sgip_submit_sm_set_messagecoding(sgipg_submit* cs, unsigned char cMsgCoding);
int sgip_submit_sm_set_messagetype(sgipg_submit* cs, unsigned char cMsgType);
int sgip_submit_sm_set_messagecontent(sgipg_submit* cs, void *sMsgContent, unsigned int nSize);
int sgip_get_datetime();
class CJobSgip:public IJobDesc {
public:
CJobSgip(SOCKET &hSocket, CSgip* sgip);
CJobSgip(sgipg_submit pss, CSgip* sgip, unsigned int nSeq, unsigned int nDateTime);
~CJobSgip();
void RecvMOProc();
void SendMTProc();
int nType; //1:send mt 0:get mo
private:
sgip_conn sp_conn;
CSgip* m_sgip;
sgipg_submit ss;
unsigned int m_nSeq;
unsigned int m_nDateTime;
};
class CWorkerSgip:public IWorker {
virtual void ProcessJob( IJobDesc* pJobDesc );
};
class SGIP_API CSgip{
friend class CJobSgip;
public:
CSgip();
~CSgip();
int Start(char* sLocalIP, int nLocalPort, char* sPeerIP, int nPeerPort, \
char* sLoginName, char* sLoginPwd, char* sSrcNum, \
void (*m_PDeliver)(DeliverStr deliver), void (*m_PReport)(ReportStr report), \
void (*m_PResponse)(MTRespStr response), void (*m_PMTError)(MTErrorStr mterror), \
int nConnCount = 3, bool fOuptutDebugInfo = false);
void Release();
// V1.25版本的Submit函數增加了輸出參數nDatetime(submit包的時間戳,序列號中的第二個字段),
// 與nSeq結合能夠做到唯一標識一條submit消息(即使系統(tǒng)重新啟動,nSeq重新歸零).
void Submit(sgipg_submit ss, unsigned int &nSeq, unsigned int &nDateTime/*, unsigned int &nMsgCount*/);
void Dump(sgipg_packet* sp);
const char* GetErrMsg(int nError);
// 函數名稱: AddUserNumber
// 函數功能: 支持群發(fā)的設置目的號碼的函數.
// 輸入參數:
// 輸出參數:
// 返回值:
// 描述:
// sUserNumber可以是單個的手機號碼,或者以逗號,中劃線隔開的多個號碼.
// 可以是以下幾種類型之一,例如:"8613312345678",或"8613312345678,86133123456789",
// 或"8613312345670-8613312345679",或"8613312345670,8613312345675-8613312345689",或"8613012345678,8613012345679-8613012345688,8613312312312"。
//
// 版本: V1.0
int AddUserNumber(sgipg_submit* ss, const char* sUserNumber);
//得到下一條要發(fā)submit消息的序列號
unsigned int GetSubmitSeqId();
int SubmitFunc(sgipg_submit ss, unsigned int nSeq, unsigned int nDateTime);
private:
bool LocalListen();
bool IsValidIPAddr(LPCTSTR sIPAddr);
bool CreateLogFile();
bool TestPeerLogin();
sgip_conn* GetSubmitConn(int &nConnIndex);
void ChangeStatus(int nConnIndex, bool fBusy);
int LoginSmg(sgip_conn *pConn);
void LogoutSmg(sgip_conn *pConn);
bool CreateConn();
bool ReleaseConn();
private:
void Trace(LPCTSTR sEvent, ...);
static DWORD WINAPI SgipServFunc(LPVOID pParam);
virtual DWORD SgipServProc();
void (*m_PDeliver)(DeliverStr deliver);
void (*m_PReport)(ReportStr report);
void (*m_PResponse)(MTRespStr response);
void (*m_PMTError)(MTErrorStr mterror);
private:
CString m_sPeerAddr; //網關IP
int m_nPeerPort; //網關端口
CString m_sUserName; //登錄用戶名
CString m_sPwd; //登錄口令
int m_nConnType; //連接類型
CString m_sSrcNum; //原節(jié)點號碼
CString m_sLocalIPAddr; //本機地址
int m_nLocalPort; //本地監(jiān)聽端口
CString m_sLogPath; //日志文件路徑
BOOL m_fStop; //系統(tǒng)停止標志
BOOL m_fLogEvent; //是否記錄系統(tǒng)日志
BOOL m_fStarted; //是否已經啟動
SOCKET serverSocket; //本地監(jiān)聽套接字
CThreadPool pool; //線程池
CWorkerSgip m_worker;
CJobSgip *m_pJob;
HANDLE m_hThread; //本地監(jiān)聽線程的句柄
unsigned int m_nCounter; //消息的數量
sgip_conn SubmitConn[MAX_PATH];
int m_nSubmitConn;
CCriticalSection m_arrayCs;
int m_nConnIndex;
};
#endif // !defined(AFX_SGIP_H__3164D539_D12F_4413_B519_24C91E94101E__INCLUDED_)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -