📄 cmpp30.cpp
字号:
// Cmpp20.cpp: implementation of the CCmpp30 class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "EasyTradeService.h"
#include "Cmpp30.h"
#include "md5.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
void PK_CMPP30(CMPP_SUBMIT30 * pSubmit,
int* pk_len,
char *corpId,
char* srcTermid,
char* destTermid,
char* chargeTermid,
int feeuserType,
char* feeType,
char* feecode,
char* serviceid,
int msgFormat,
int msgLength,
char* msgContent,
char* linkId)
{
memset(pSubmit, 0, sizeof(CMPP_SUBMIT30));
pSubmit->pkgnumber=1;
pSubmit->pkgtotal=1;
pSubmit->delivery=1;
pSubmit->desttotal= 1;
pSubmit->feenumbertype=0;
pSubmit->destnumbertype=0;
pSubmit->msglen = msgLength;
pSubmit->msgfmt = msgFormat;
pSubmit->feeusertype =feeuserType;
memcpy(pSubmit->msgsrc,corpId,sizeof(pSubmit->msgsrc));
memcpy(pSubmit->feetype, feeType,sizeof(pSubmit->feetype));
memcpy(pSubmit->feecode, feecode,sizeof(pSubmit->feecode));
strcpy(pSubmit->serviceid, serviceid);
strcpy(pSubmit->srcnumber,srcTermid);
if(strnicmp(pSubmit->destnumbers,"86",2)!=0)
{
pSubmit->destnumbers[0]='8';
pSubmit->destnumbers[1]='6';
strcpy(pSubmit->destnumbers+2,destTermid);
}
else
{
strcpy(pSubmit->destnumbers,destTermid);
}
strcpy(pSubmit->feenumber,chargeTermid);
memcpy(pSubmit->msgcontent,msgContent,msgLength);
if(linkId) strcpy(pSubmit->msgcontent+msgLength, linkId);
*pk_len=sizeof(CMPP_HEAD30)+sizeof(CMPP_SUBMIT30);
*pk_len= *pk_len- (sizeof(pSubmit->msgcontent)-msgLength);
}
CCmpp30::CCmpp30()
{
}
CCmpp30::~CCmpp30()
{
}
__int64 CCmpp30::_ntoh64( __int64 inval)
{
__int64 outval = 0;
for( int i=0; i<8; i++)
outval = ( outval << 8) + ( ( inval >> ( i * 8)) & 255);
return outval;
}
__int64 CCmpp30:: _hton64( __int64 inval)
{
return _ntoh64( inval);
}
void CCmpp30::OnRecv()
{
int ret,len,cmdid=0;
FD_SET fdset;
TIMEVAL timeout;
timeout.tv_sec = 1;
timeout.tv_usec= 0;
CMPP_HEAD30 head;
char recvbuff[512];
char szMsgId[24];
char szResp[64];
CMPP_SUBMIT_RESP30 *pSubmitResp=0;
CMPP_DELIVER30 *pCmppDeliver=0;
CMPP_DELIVER_RESP30 *pCmppDeliverResp=0;
CMPP_MTREPORT30 *pCmppReport=0;
DELIVER_SMS deliverSMS;
MTREPORT_SMS reportSMS;
while(!m_bQuit)
{
FD_ZERO( &fdset);
FD_SET(m_Socket, &fdset);
ret = select(0,&fdset,NULL,NULL,&timeout);
if( ret == SOCKET_ERROR)
{
OnSocketError();
continue;
}
if( ret == 0)
{
continue;
}
ret =::recv( m_Socket ,(char*)&head, sizeof( CMPP_HEAD30 ) ,0);
if( ret != sizeof( CMPP_HEAD30))
{
if(ret==0||ret== SOCKET_ERROR)
{
OnSocketError();
}
continue;
}
len= ntohl(head.size ) - sizeof( CMPP_HEAD30 );
ret =::recv(m_Socket, recvbuff, len ,0 );
if( ret != len )
{
if(ret==0||ret==SOCKET_ERROR)
{
OnSocketError();
}
continue;
}
int cmdid=ntohl(head.cmdid);
switch(cmdid)
{
case nCMPP_SUBMIT_RESP:
pSubmitResp= (CMPP_SUBMIT_RESP30 *)recvbuff;
pSubmitResp->msgid=_ntoh64( pSubmitResp->msgid );
sprintf(szMsgId,"%0X%0X", *(((int *)&pSubmitResp->msgid) +1), pSubmitResp->msgid );
OnSubmitResp(ntohl(head.seqid),ntohl(pSubmitResp->result),szMsgId);
break;
case nCMPP_DELIVER:
pCmppDeliver=(CMPP_DELIVER30*)recvbuff;
*((CMPP_HEAD30 *)szResp)=head;
len= sizeof( CMPP_HEAD30) + sizeof(CMPP_DELIVER_RESP30 );
((CMPP_HEAD30 *)szResp)->size=htonl(len);
((CMPP_HEAD30 *)szResp)->cmdid=htonl(nCMPP_DELIVER_RESP);
((CMPP_DELIVER_RESP30 *)(szResp+ sizeof( CMPP_HEAD30)))->msgid= pCmppDeliver->msgid ;
((CMPP_DELIVER_RESP30 *)(szResp+ sizeof( CMPP_HEAD30)))->result=0 ;
ret=Send(szResp,len);
if(ret==len)
{
if(pCmppDeliver->delivery) //状态报告
{
pCmppReport=(CMPP_MTREPORT30 *)pCmppDeliver->msgcontent;
pCmppReport->msgid=_ntoh64(pCmppReport->msgid);
reportSMS.protrol=0;
strcpy(reportSMS.corpId,m_szCorpId);
strcpy(reportSMS.srcTermid,pCmppDeliver->srcnumber);
strcpy(reportSMS.destTermid,pCmppReport->dest_terminal_id);
sprintf(reportSMS.smgMsgId,"%0X%0X", *(((int *)&pCmppReport->msgid) +1), pCmppReport->msgid );
memcpy(reportSMS.state,pCmppReport->stat,7);
reportSMS.errorCode=0;
OnMTReportSMS(&reportSMS);
}
else
{
deliverSMS.protrol=0;
strcpy(deliverSMS.corpId,m_szCorpId);
deliverSMS.msgFormat=pCmppDeliver->msgfmt;
strcpy(deliverSMS.srcTermid,pCmppDeliver->srcnumber);
strcpy(deliverSMS.destTermid,pCmppDeliver->destnumber);
memcpy(deliverSMS.msgContent,pCmppDeliver->msgcontent,pCmppDeliver->msglen);
deliverSMS.msgContent[pCmppDeliver->msglen]=0;
pCmppDeliver->msgid=_ntoh64(pCmppDeliver->msgid);
sprintf(deliverSMS.smgMsgId,"%0X%0X", *(((int *)&pCmppDeliver->msgid) +1), pCmppReport->msgid );
OnDeliverSMS(&deliverSMS);
}
}
else
{
if(ret==0||ret==SOCKET_ERROR)
{
OnSocketError();
}
}
break;
case nCMPP_ACTIVE_TEST:
*((CMPP_HEAD30 *)szResp)=head;
len=sizeof(CMPP_HEAD30) + sizeof(CMPP_ACTIVE_TEST_RESP30 );
((CMPP_HEAD30 *)szResp)->size=htonl(len);
((CMPP_HEAD30 *)szResp)->cmdid=htonl(nCMPP_ACTIVE_TEST_RESP);
((CMPP_ACTIVE_TEST_RESP30 *)(szResp+ sizeof( CMPP_HEAD30)))->reserve=0 ;
ret=Send(szResp,len);
if(ret==0||ret==SOCKET_ERROR)
{
OnSocketError();
}
break;
case nCMPP_CONNECT_RESP:
break;
case nCMPP_ACTIVE_TEST_RESP:
break;
default:
break;
}
}
}
int CCmpp30:: SubmitSMS(SUBMIT_SMS *p ,int len,int seqid)
{
((CMPP_HEAD30 * )(p->pkg))->cmdid = htonl(nCMPP_SUBMIT);
((CMPP_HEAD30 * )(p->pkg))->size = htonl( len );
((CMPP_HEAD30 * )(p->pkg))->seqid = htonl( seqid );
return Send(p->pkg,len);
}
void CCmpp30::OnSocketError()
{
int ret;
EnterCriticalSection( &m_csSocket);
ret=Connect();
if(ret==0)
{
char szbuff[64];
char authsrc[24]={0}, szTimeStamp[12]={0};
int nsize = sizeof( CMPP_HEAD30) + sizeof( CMPP_CONNECT30);
((CMPP_HEAD30 * )szbuff)->size = htonl( nsize);
((CMPP_HEAD30 * )szbuff)->cmdid = htonl( nCMPP_CONNECT);
((CMPP_HEAD30 * )szbuff)->seqid = htonl(GetSeqid(0));
GetTimeStamp(szTimeStamp);
strcpy(((CMPP_CONNECT30*)(szbuff+sizeof( CMPP_HEAD30)))->spid, m_szUser);
MD5 ctx;
ctx.update((unsigned char *)m_szUser, strlen(m_szUser));
ctx.update((unsigned char *)"\0\0\0\0\0\0\0\0\0", 9);
ctx.update((unsigned char *)m_szPwd, strlen(m_szPwd));
ctx.update((unsigned char *)szTimeStamp, 10);
ctx.finalize();
ctx.raw_digest((unsigned char *)((CMPP_CONNECT30*)(szbuff+sizeof( CMPP_HEAD30)))->digest);
((CMPP_CONNECT30*)(szbuff+sizeof( CMPP_HEAD30)))->ver=0x30;
((CMPP_CONNECT30*)(szbuff+sizeof( CMPP_HEAD30)))->timestamp=htonl(atol(szTimeStamp));
::send(m_Socket,szbuff, nsize,0 );
}
LeaveCriticalSection( &m_csSocket);
}
int CCmpp30::Login()
{
char szbuff[64];
char authsrc[24]={0}, szTimeStamp[12]={0};
int nsize = sizeof( CMPP_HEAD30) + sizeof( CMPP_CONNECT30);
((CMPP_HEAD30 * )szbuff)->size = htonl( nsize);
((CMPP_HEAD30 * )szbuff)->cmdid = htonl( nCMPP_CONNECT);
((CMPP_HEAD30 * )szbuff)->seqid = htonl(GetSeqid(0));
GetTimeStamp(szTimeStamp);
strcpy(((CMPP_CONNECT30*)(szbuff+sizeof( CMPP_HEAD30)))->spid, m_szUser);
MD5 ctx;
ctx.update((unsigned char *)m_szUser, strlen(m_szUser));
ctx.update((unsigned char *)"\0\0\0\0\0\0\0\0\0", 9);
ctx.update((unsigned char *)m_szPwd, strlen(m_szPwd));
ctx.update((unsigned char *)szTimeStamp, 10);
ctx.finalize();
ctx.raw_digest((unsigned char *)((CMPP_CONNECT30*)(szbuff+sizeof( CMPP_HEAD30)))->digest);
((CMPP_CONNECT30*)(szbuff+sizeof( CMPP_HEAD30)))->ver=0x30;
((CMPP_CONNECT30*)(szbuff+sizeof( CMPP_HEAD30)))->timestamp=htonl(atol(szTimeStamp));
int ret=Send(szbuff, nsize);
if(ret== nsize)
{
nsize= sizeof( CMPP_HEAD30) + sizeof( CMPP_CONNECT_RESP30);
ret=recv(m_Socket,szbuff,nsize,0);
if(ret==nsize)
{
return ntohl(((CMPP_CONNECT_RESP30 *)(szbuff + sizeof( CMPP_HEAD30)))->status);
}
else
{
return WSAGetLastError();
}
}
return WSAGetLastError();
}
int CCmpp30::Logout()
{
CMPP_HEAD30 head;
head.size=htonl(sizeof(CMPP_HEAD30));
head.cmdid=htonl(nCMPP_TERMINATE);
head.seqid=htonl(GetSeqid(0));
int ret=Send((char *)&head,sizeof(CMPP_HEAD30));
return 0;
}
int CCmpp30::Startup(char *szIp,int port,
char *szUser,char *szPwd,
char *szCorpId, char *szSeverNumber,char *szSpNode,
int threadpool,int wndsize,
int timeout,int trys,
void (*OnDeliverSMS)(DELIVER_SMS *pDeliver),
void (*OnMTReportSMS)(MTREPORT_SMS *pReport),
void (*OnSubmitedSMS)(SUBMIT_SMS *pSubmited))
{
m_OnDeliverSMS=OnDeliverSMS;
m_OnMTReportSMS=OnMTReportSMS;
m_OnSubmitedSMS=OnSubmitedSMS;
strcpy(m_szIp, szIp);
m_nPort=port ;
strcpy(m_szUser,szUser) ;
strcpy(m_szPwd,szPwd) ;
if(szCorpId) strcpy(m_szCorpId, szCorpId);
if(szSeverNumber) strcpy(m_szSeverNumber,szSeverNumber);
if(szSpNode) strcpy(m_szSpNode,szSpNode);
int ret=Connect();
if(ret==0)
{
ret=Login();
}
Initialize(threadpool,wndsize,timeout,trys);
return ret;
}
int CCmpp30::Cleanup()
{
Logout();
Close();
return 0;
}
void CCmpp30::OnActive()
{
int timeActive=0;
CMPP_HEAD30 head;
while(!m_bQuit)
{
Sleep(1000);
if(timeActive++>= 60 )
{
head.cmdid= htonl(nCMPP_ACTIVE_TEST);
head.seqid= htonl(GetSeqid(0));
head.size= htonl(sizeof(CMPP_HEAD30));
Send((char *)&head,sizeof(CMPP_HEAD30));
timeActive=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -