小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

基于TCP協(xié)議的短信數(shù)據(jù)包打包與解包及應(yīng)用 - capter的專欄

 accesine 2005-10-12
基于TCP協(xié)議的短信數(shù)據(jù)包打包與解包及應(yīng)用
基于TCP協(xié)議的短信數(shù)據(jù)包打包與解包及應(yīng)用
孟培遠(yuǎn) 05-09-16 11:30
首先是CMPPClient.cpp中執(zhí)行主函數(shù)main(),調(diào)用bool CMPPClientStart(),首先綁定套接字cmpp.bind(),然后連接數(shù)據(jù)庫,循環(huán)判斷是否有信息要發(fā)送,如果有信息發(fā)送,則提交要發(fā)送的信息iRet = cmpp.SubmitSM(),判斷提交的結(jié)果,分別進(jìn)行處理,更新數(shù)據(jù)庫中短信發(fā)送狀態(tài), 接收從短信中心來的數(shù)據(jù)iStatus = cmpp.RecvDataFromSMC(lCommandId, osRecvData),根據(jù)接收的狀態(tài)進(jìn)行判斷處理,如果狀態(tài)為MSG_SUCCESS,則進(jìn)行判斷各種命令,并進(jìn)行處理,如果命令為CMPP_DELIVER,則進(jìn)行iRet = cmpp.DeliverSM(),判斷結(jié)果,并根據(jù)結(jié)果進(jìn)行相應(yīng)的處理
這個(gè)部分主要是短信的接收與發(fā)送,分別在兩個(gè)不同進(jìn)程中實(shí)現(xiàn)3888中為:cmcc.cpp和recv.cpp,其實(shí)發(fā)送與接收的程序基本相同,主要是接收recv.cpp中把發(fā)送的代碼屏蔽了.
在02166中是CMPPClient.cpp發(fā)送與接收代碼同在一個(gè)進(jìn)程中進(jìn)行運(yùn)行.
下面主要就02166的代碼進(jìn)行說明:

 


CMPP.cpp的主要功能是,對數(shù)據(jù)打包解包以及各種數(shù)據(jù)的更改進(jìn)行封裝到具體函數(shù)內(nèi),CMPP.cpp主要是調(diào)用CMPPduCode.cppSocket.cpp里面的函數(shù)進(jìn)行數(shù)據(jù)的打包,解包,發(fā)送與接收.
CMPP.cpp的主要函數(shù)及功能說明如下:
制作連接數(shù)據(jù)包
MakeConnectPDU(char* p_pSystemID, char* p_pPasswd, Octstr& p_OctStr)
(調(diào)用m_PduCode.Pdu_Encode_Connect(PDUConnect, p_OctStr);進(jìn)行連接數(shù)據(jù)打包)
制作發(fā)送信息數(shù)據(jù)包
MakeSmsSendPDU( char  p_cPkTotal,char  p_cPkNumber,char  p_cRegisteredDelivery,
char  p_cMsgLevel,char* p_pServiceId,char  p_cFeeUserType,char* p_pFeeTerminalId,
char  p_cFeeTerminalType,char  p_cTPpid,char  p_cTPudhi,       char  p_cMsgFmt,
char* p_pMsg_src,       char* p_pFeeType, char* p_pFeeCode, char* p_pValidTime,
char* p_pAtTime,  char* p_pSrcId,char* p_pDestTerminalId,char  p_cDestTerminalType,
char  p_cMsgLength,char* p_pMsgContent,char* p_pLinkID,Octstr& p_OctStr)
(調(diào)用m_PduCode.Pdu_Encode_Submit(PduSubmitSm, p_OctStr); 提交信息打包)
制作接收回應(yīng)數(shù)據(jù)包
MakeDeliverRespPDU(long p_lSeqNum,char* p_pMsgId,long p_cResult, Octstr& p_OctStr)
(調(diào)用m_PduCode.Pdu_Encode_Deliver_Resp(p_lSeqNum, PDUDeliverResp, p_OctStr);信息打包)
制作測試數(shù)據(jù)包
MakeActiveTestPDU(Octstr& p_OctStr)
(調(diào)用m_PduCode.Pdu_Encode_ActiveTest(p_OctStr);進(jìn)行數(shù)據(jù)打包)
制作測試回應(yīng)數(shù)據(jù)包
MakeActiveTestRespPDU(long p_lSeqNum, Octstr& p_OctStr)
(調(diào)用m_PduCode.Pdu_Encode_ActiveTest_Resp(p_lSeqNum, p_OctStr);進(jìn)行數(shù)據(jù)打包)
制作終止數(shù)據(jù)包
MakeTerminatePDU(Octstr& p_OctStr)
(調(diào)用m_PduCode.Pdu_Encode_Terminate(p_OctStr);)
制作終止回應(yīng)數(shù)據(jù)包
MakeTerminateRespPDU(long p_lSeqNum, Octstr& p_OctStr)
(調(diào)用m_PduCode.Pdu_Encode_Terminate_Resp(p_lSeqNum, p_OctStr);進(jìn)行數(shù)據(jù)打包)
綁定
Bind(string& p_strHost, int p_iPort, string& p_strSystemID, string& p_strPasswd)
(調(diào)用ReBind())
根據(jù)已保存的參數(shù),重新綁定到短訊中心
ReBind()
(調(diào)用MakeConnectPDU((char*)m_strSystemID.c_str(), (char*)m_strPasswd.c_str(), osSendData);進(jìn)行數(shù)據(jù)打包,然后發(fā)送信息進(jìn)行測試是否連接)
釋放與短訊中心的綁定
UnBind()
(調(diào)用m_socket.Close();進(jìn)行斷開套接字)
發(fā)送短消息
(1) SubmitSM(long& p_lSeqNum, cmpp_pdu_submit_sm& p_PduSubmit)
(調(diào)用(3) SubmitSM() )
發(fā)送短消息
(2) SubmitSM(long& p_lSeqNum,int  p_iPkTotal,int  p_iPkNumber,int  p_iRegisteredDelivery,
int  p_iMsgLevel,string p_strServiceId,int  p_iFeeUserType,string p_strFeeTerminalId,
int  p_iFeeTerminalType, //(3.0中添加字段) int  p_iTPpid,int  p_iTPudhi,int  p_iMsgFmt,
string p_strMsgSrc,       string p_strFeeType,string p_strFeeCode,string p_strValidTime,
string p_strAtTime,       string p_strSrcId,string p_strDestTerminalId, int  p_iDestTerminalType, //(3.0中添加字段)int  p_iMsgLength,string p_strMsgContentHex,string p_strLinkID)
(調(diào)用(1) SubmitSM())
發(fā)送短消息
(3) SubmitSM(long& p_lSeqNum,char p_cPkTotal,char p_cPkNumber,char p_cRegisteredDelivery,
char  p_cMsgLevel,char* p_pServiceId,char  p_cFeeUserType,char* p_pFeeTerminalId,
char  p_cFeeTerminalType,char  p_cTPpid,char  p_cTPudhi,       char  p_cMsgFmt,       char* p_pMsg_src,char* p_pFeeType,char* p_pFeeCode,char* p_pValidTime,char* p_pAtTime,
char* p_pSrcId,char* p_pDestTerminalId, char  p_cDestTerminalType,   //(3.0中添加字段)
char  p_cMsgLength,char* p_pMsgContent,char* p_pLinkID)    //(3.0中添加字段)
(調(diào)用MakeSmsSendPDU( p_cPkTotal,       p_cPkNumber, p_cRegisteredDelivery, p_cMsgLevel,
p_pServiceId, p_cFeeUserType, p_pFeeTerminalId,    p_cFeeTerminalType, p_cTPpid,
p_cTPudhi, p_cMsgFmt, p_pMsg_src, p_pFeeType,  p_pFeeCode, p_pValidTime, p_pAtTime, p_pSrcId,     p_pDestTerminalId, p_cDestTerminalType, p_cMsgLength, p_pMsgContent,
p_pLinkID, osSendData);對要發(fā)送的數(shù)據(jù)進(jìn)行打包,然后m_socket.Send((char*)osSendData.data, osSendData.len);發(fā)送數(shù)據(jù),再調(diào)用m_socket.Receive((char*)osRecvData.data, osRecvData.len);接收發(fā)送后的返回信息,調(diào)用 iResult = m_PduCode.Pdu_Decode_Submit_Resp(osRecvData, PduHead, PduSubmitResp);對接收到的數(shù)據(jù)進(jìn)行解包,返回解包成功與否的信息)
提交短信回復(fù)信息(提交完信息后回復(fù)過來的信息,進(jìn)行解包)
SubmitSMResp(string& p_strMsgIdHex,Octstr& p_OctStr) 
(調(diào)用m_PduCode.Pdu_Decode_Submit_Resp(p_OctStr, PduHead, PduSubmitResp);進(jìn)行數(shù)據(jù)解包)
接收短信中心下發(fā)數(shù)據(jù)
RecvDataFromSMC(long& p_lCommandId, Octstr& p_osRecvData)
(調(diào)用m_socket.Receive((char*)p_osRecvData.data, p_osRecvData.len);接收數(shù)據(jù),調(diào)用m_PduCode.Pdu_Decode_Command(p_osRecvData);進(jìn)行數(shù)據(jù)解包)
接收從短信中心發(fā)送過來或者從其他網(wǎng)關(guān)轉(zhuǎn)發(fā)過來的短信傳給SP
(1)DeliverSM( Octstr& p_OctStr,long& p_lSeqNum,string& p_pMsgIdHex,string& p_pDestId,
string& p_pServiceId,int& p_TPpid,int& p_TPudhi,int& p_MsgFmt, string& p_pSrcTerminalId,
int& p_SrcTerminalType, //(3.0中添加字段)int& p_RegisteredDelivery,int& p_MsgLength,
string& p_pMsgContentHex, string& p_pLinkID) //(3.0中添加字段)
(調(diào)用(2)DeliverSM(p_OctStr, p_lSeqNum, szMsgId, szDestId, szServiceId, cTPpid, cTPudhi,
cMsgFmt, szSrcTerminalId, cSrcTerminalType,cRegisteredDelivery, cMsgLength,szMsgContent, szLinkID);進(jìn)行數(shù)據(jù)賦值)
對接收到數(shù)據(jù)是短信下發(fā)進(jìn)行解包處理
(2) DeliverSM(       Octstr& p_OctStr,long& p_lSeqNum,char* p_pMsgId,      char* p_pDestId,
char* p_pServiceId,char& p_TPpid,char& p_TPudhi,char& p_MsgFmt,char* p_pSrcTerminalId,
char& p_SrcTerminalType,  //(3.0中添加字段)char& p_RegisteredDelivery,
char& p_MsgLength,char* p_pMsgContent,       char* p_pLinkID)//(3.0中添加字段)
(調(diào)用MakeDeliverRespPDU(PduHead.sequence_id, (char*)PduDeliver.Msg_Id, cResult, osSendData);進(jìn)行數(shù)據(jù)接收, m_socket.Send((char*)osSendData.data, osSendData.len);發(fā)送信息到短信中心)
活動(dòng)測試(活動(dòng)測試要求(10~15秒)就需發(fā)送測試)
ActiveTest()//動(dòng)態(tài)測試
(調(diào)用MakeActiveTestPDU(osSendData);進(jìn)行數(shù)據(jù)打包m_socket.Send((char*)osSendData.data, osSendData.len);發(fā)送數(shù)據(jù)包, m_socket.Receive((char*)osRecvData.data, osRecvData.len);接收數(shù)據(jù)包, m_PduCode.Pdu_Decode_ActiveTest_Resp(osRecvData, PduHead);接收到的數(shù)據(jù)包進(jìn)行解包)
對接收到數(shù)據(jù)是活動(dòng)測試進(jìn)行解包處理
ActiveTestResp(Octstr& p_OctStr)
(調(diào)用m_PduCode.Pdu_Decode_ActiveTest(p_OctStr, PduHead)進(jìn)行數(shù)據(jù)解包MakeActiveTestRespPDU(PduHead.sequence_id, osSendData);對是數(shù)據(jù)進(jìn)行打包m_socket.Send((char*)osSendData.data, osSendData.len); 發(fā)送數(shù)據(jù)到短訊中心)
請求拆除連接
Terminate()
(調(diào)用MakeTerminatePDU(osSendData);進(jìn)行請求斷開的數(shù)據(jù)進(jìn)行打包, m_socket.Send((char*)osSendData.data, osSendData.len); 發(fā)送數(shù)據(jù)到短訊中心m_socket.Receive((char*)osRecvData.data, osRecvData.len);從短信中心接收數(shù)據(jù)包, m_PduCode.Pdu_Decode_Terminate_Resp(osRecvData, PduHead);對接收到的數(shù)據(jù)進(jìn)行解包)
對接收到數(shù)據(jù)是請求拆除連接進(jìn)行解包處理
TerminateResp(Octstr& p_OctStr)
(調(diào)用m_PduCode.Pdu_Decode_Terminate(p_OctStr, PduHead)進(jìn)行數(shù)據(jù)解包, MakeTerminateRespPDU(PduHead.sequence_id, osSendData);對回應(yīng)的數(shù)據(jù)進(jìn)行打包m_socket.Send((char*)osSendData.data, osSendData.len);把回應(yīng)的數(shù)據(jù)發(fā)送到短信中心)
 
 
在Socket.cpp中用到的主要是Send(),Receive()兩個(gè)函數(shù),分別用來發(fā)送數(shù)據(jù)和接受數(shù)據(jù)
具體函數(shù)如下:
連接函數(shù)
Connect(const string& p_strHost, int p_iPort)
發(fā)送函數(shù)
(1)    Send(const char *p_pchBuf, int p_iLen, unsigned int p_iFlag)
發(fā)送函數(shù)
(2)    Send(const string& p_strInfo, unsigned int p_iFlag)
發(fā)送(1)與發(fā)送(2)不同之處在于沒有發(fā)送信息的長度
 
接收函數(shù)
(1)    Receive(char *p_pchBuf, int p_iLen, unsigned int p_iFlag)
接收函數(shù)
(2)    Receive(string& p_strInfo, unsigned int p_iFlag)
接收(1)與接收(2)不同之處在于沒有接受信息的長度
而在CMPPduCode.cpp中則是打包和解包的詳細(xì)操作:
包頭解碼(整型數(shù)據(jù)轉(zhuǎn)主機(jī)字節(jié)序)//網(wǎng)絡(luò)字節(jié)轉(zhuǎn)化為主機(jī)字節(jié)
pdu_header_decode(cmpp_pdu_head& p_PduHead)
包頭編碼(整型數(shù)據(jù)轉(zhuǎn)網(wǎng)絡(luò)字節(jié)序)//主機(jī)字節(jié)轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)
pdu_header_encode(cmpp_pdu_head& p_PduHead)
解包獲取命令
Pdu_Decode_Command(Octstr& p_OctData)
連接到短信中心數(shù)據(jù)打包  //連接到短信中心的數(shù)據(jù)進(jìn)行打包
Pdu_Encode_Connect(const cmpp_pdu_connect& p_PduConnect, Octstr& p_OctStr)
連接到短信中心返回?cái)?shù)據(jù)解包
Pdu_Decode_Connect_Resp(const Octstr& p_OctData, cmpp_pdu_head& p_PduHead, cmpp_pdu_connect_resp& p_PduConnectResp)
發(fā)送短信數(shù)據(jù)打包
Pdu_Encode_Submit(const cmpp_pdu_submit_sm& p_PduSubmit, Octstr& p_OctStr)
發(fā)送短信返回?cái)?shù)據(jù)解包
Pdu_Decode_Submit_Resp(const Octstr& p_OctData, cmpp_pdu_head& p_PduHead, cmpp_pdu_submit_sm_resp& p_PduSubmitResp)
接收短信返回?cái)?shù)據(jù)解包(CMPP_DELIVER是ISMG把從短信中心或其他ISMG轉(zhuǎn)發(fā)來的短信交給SP
Pdu_Decode_Deliver(const Octstr& p_OctData, cmpp_pdu_head& p_PduHead, cmpp_pdu_deliver_sm& p_PduDeliver)
接收短信后要返回信息,進(jìn)行數(shù)據(jù)打包
Pdu_Encode_Deliver_Resp(long p_lSeqNum, const cmpp_pdu_deliver_sm_resp& p_PduDeliverResp, Octstr& p_OctStr)
活動(dòng)測試數(shù)據(jù)打包(SP --> ISMG 或 ISMG --> SP
Pdu_Encode_ActiveTest(Octstr& p_OctStr)
活動(dòng)測試數(shù)據(jù)解包
Pdu_Decode_ActiveTest(const Octstr& p_OctStr, cmpp_pdu_head& p_PduHead)
活動(dòng)測試返回?cái)?shù)據(jù)解包
Pdu_Decode_ActiveTest_Resp(const Octstr& p_OctStr, cmpp_pdu_head& p_PduHead)
活動(dòng)測試返回?cái)?shù)據(jù)打包
Pdu_Encode_ActiveTest_Resp(long lSeqNum, Octstr& p_OctStr)
請求拆除連接數(shù)據(jù)打包
Pdu_Encode_Terminate(Octstr& p_OctStr)//只有包頭,沒有包體
請求拆除連接數(shù)據(jù)解包
Pdu_Decode_Terminate(const Octstr& p_OctStr, cmpp_pdu_head& p_PduHead)
請求拆除連接返回?cái)?shù)據(jù)解包
Pdu_Decode_Terminate_Resp(const Octstr& p_OctStr, cmpp_pdu_head& p_PduHead)
請求拆除連接返回?cái)?shù)據(jù)打包
Pdu_Encode_Terminate_Resp(long lSeqNum, Octstr& p_OctStr)
 

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多