⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmpp30.cpp

📁 短信防伪系统服务器端
💻 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 + -