📄 smpprotocol.cpp
字号:
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
time(&lTimeNow);
}
if((m_dwCommandStatus == COMMAND_STATUS_INIT)||(m_dwCommandStatus == 1))
{
SMPPLogOutTRN();
m_dwStatusTRN = LOGIN_BREAKED;
Print("[TSTLNK][TRN]链路被中断...重新注册");
SMPPLogInTRN(m_szSMPPIP,m_nSMPPort,m_struSMPPLogIn);
}
else
Print("[TSTLNK][TRN]链路正常!");
*/
return 0;
}
void CSMPProtocol::OnReceive(int nErrorCode)
{
}
int CSMPProtocol::CompresStruct(CSMPProtocol::struSMPPLOGIN struSmppLogIn,char* szDestBuff)
{
int nLen,nOffset = 0;
nLen = strlen(struSmppLogIn.szSystemID);
memcpy(szDestBuff,struSmppLogIn.szSystemID,nLen+1);
nOffset += nLen+1;
nLen = strlen(struSmppLogIn.szPassword);
memcpy(szDestBuff+nOffset,struSmppLogIn.szPassword,nLen+1);
nOffset += nLen+1;
nLen = strlen(struSmppLogIn.szSystemType);
memcpy(szDestBuff+nOffset,struSmppLogIn.szSystemType,nLen+1);
nOffset += nLen+1;
memcpy(szDestBuff+nOffset,&struSmppLogIn.nInterfaceVersion,3);
nOffset += 3;
nLen = strlen(struSmppLogIn.szAddressRange);
memcpy(szDestBuff+nOffset,struSmppLogIn.szAddressRange,nLen+1);
nOffset += nLen+1;
return nOffset;
}
int CSMPProtocol::CompresStruct(CSMPProtocol::struSMPPSUBMIT struSmppSubmit,char* szDestBuff)
{
int nLen,nOffset = 0;
char szSourcehead[21];
memset(szSourcehead,0,sizeof(szSourcehead));
nLen = strlen(struSmppSubmit.szServiceType);
memcpy(szDestBuff,struSmppSubmit.szServiceType,nLen+1);
nOffset += nLen+1;
memcpy(szDestBuff+nOffset,&struSmppSubmit.nSourceAddressTon,2);
nOffset += 2;
memcpy(szSourcehead,struSmppSubmit.szSourceAddress+2,strlen(struSmppSubmit.szSourceAddress)-2);
nLen = strlen(struSmppSubmit.szSourceAddress);
//nLen = strlen(szSourcehead);
memcpy(szDestBuff+nOffset,struSmppSubmit.szSourceAddress,nLen+1);
nOffset += nLen+1;
memcpy(szDestBuff+nOffset,&struSmppSubmit.nDestAddressTon,2);
nOffset += 2;
nLen = strlen(struSmppSubmit.szDestAddress);
memcpy(szDestBuff+nOffset,struSmppSubmit.szDestAddress,nLen+1);
nOffset += nLen+1;
memcpy(szDestBuff+nOffset,&struSmppSubmit.nEsmClass,3);
nOffset += 3;
nLen = strlen(struSmppSubmit.szScheduleDeliveryTime);
memcpy(szDestBuff+nOffset,struSmppSubmit.szScheduleDeliveryTime,nLen+1);
nOffset += nLen+1;
nLen = strlen(struSmppSubmit.szValidityPeriod);
memcpy(szDestBuff+nOffset,struSmppSubmit.szValidityPeriod,nLen+1);
nOffset += nLen+1;
memcpy(szDestBuff+nOffset,&struSmppSubmit.nRegisteredDeliveryflag,2);
nOffset += 2;
nLen = struSmppSubmit.nSmLength;
if(struSmppSubmit.nDataCoding == 8)
{
if(!StrToUnicode(struSmppSubmit.szShortMessageText,&nLen))
struSmppSubmit.nDataCoding = 0;
}
memcpy(szDestBuff+nOffset,&struSmppSubmit.nDataCoding,2);
nOffset += 2;
szDestBuff[nOffset] = BYTE(nLen);
nOffset += 1;
memcpy(szDestBuff+nOffset,struSmppSubmit.szShortMessageText,nLen+1);
nOffset += nLen+1;
return nOffset;
}
int CSMPProtocol::MakePackage(DWORD nCommandID,DWORD nSequenceNO,char* szBodyBuff,int nBodyLen,CSMPProtocol::struSMPPACKAGE* struSMPPackage)
{
struSMPPackage->struHead.dwCommandLength = htonl(16 + nBodyLen);
struSMPPackage->struHead.dwCommandID = htonl(nCommandID);
struSMPPackage->struHead.dwCommandStatus = htonl(0);
if(nSequenceNO == -1)
{
m_dwSequenceNO >= 0x7fffffff ? m_dwSequenceNO=1:m_dwSequenceNO++;
struSMPPackage->struHead.dwSequenceNO = htonl(m_dwSequenceNO);
}
else
struSMPPackage->struHead.dwSequenceNO = htonl(nSequenceNO);
if(nBodyLen !=0 )
memcpy(struSMPPackage->szBody,szBodyBuff,nBodyLen);
return 1;
}
int CSMPProtocol::SplitRecvMsg(char* szRecvMsg,int nMsgLen,CSMSCSocket* pSocket)
{
DWORD dwPackageLen;
struSMPPACKAGE struSMPPackage;
if((m_nHaveRcvLink == 1)&&(pSocket == m_cSMSCSocketRCV))
m_nCurrLink = 1;
if((m_nHaveTrnLink == 1)&&(pSocket == m_cSMSCSocketTRN))
m_nCurrLink = 2;
dwPackageLen = ntohl(*((DWORD*)szRecvMsg));
while(dwPackageLen <= nMsgLen)
{
memcpy(&struSMPPackage,szRecvMsg,dwPackageLen);
nMsgLen = nMsgLen - dwPackageLen;
memcpy(szRecvMsg,szRecvMsg + dwPackageLen,nMsgLen);
ProcRecvPackage(struSMPPackage);
if(nMsgLen == 0)
dwPackageLen = 1;
else
dwPackageLen = ntohl(*((DWORD*)szRecvMsg));
}
return nMsgLen;
}
int CSMPProtocol::ProcRecvPackage(CSMPProtocol::struSMPPACKAGE struSMPPackage)
{
struSMPPackage.struHead.dwCommandLength = ntohl(struSMPPackage.struHead.dwCommandLength);
struSMPPackage.struHead.dwCommandID = ntohl(struSMPPackage.struHead.dwCommandID);
struSMPPackage.struHead.dwCommandStatus = ntohl(struSMPPackage.struHead.dwCommandStatus);
struSMPPackage.struHead.dwSequenceNO = ntohl(struSMPPackage.struHead.dwSequenceNO);
if(m_nCurrLink ==1) //add by juncom on 21th Dec.
time(&m_nTimeLink_RCV);
if(m_nCurrLink ==2)
time(&m_nTimeLink_TRN);
switch(struSMPPackage.struHead.dwCommandID)
{
case ESME_BNDRCV_RESP:
m_dwCommandStatus = struSMPPackage.struHead.dwCommandStatus;
break;
case ESME_BNDTRN_RESP:
m_dwCommandStatus = struSMPPackage.struHead.dwCommandStatus;
break;
case ESME_UBD_RESP:
m_dwCommandStatus = struSMPPackage.struHead.dwCommandStatus;
break;
case ESME_SUB_SM_RESP:
ProcSubmitSMRep(struSMPPackage);
break;
case ESME_DELIVER_SM:
ProcDeliverSM(struSMPPackage);
break;
case ESME_QRYLINK_RESP:
m_nRecvLinkCount++;
m_dwCommandStatus = struSMPPackage.struHead.dwCommandStatus;
break;
default:
break;
}
return 1;
}
int CSMPProtocol::ProcSubmitSMRep(CSMPProtocol::struSMPPACKAGE struSMPPackage)
{
WaitForSingleObject(m_hEventSubmitRep,INFINITE);
m_listSubmitRep.AddTail(struSMPPackage);
SetEvent(m_hEventSubmitRep);
m_nSubmitRespCount++;
return 1;
}
int CSMPProtocol::ProcDeliverSM(CSMPProtocol::struSMPPACKAGE struSMPPackage)
{
struSMPPACKAGE struSmppPackage;
char szMessageID[20];
strcpy(szMessageID,"100");
MakePackage(ESME_DELIVER_SM_RESP, struSMPPackage.struHead.dwSequenceNO,
szMessageID,strlen(szMessageID)+1,&struSmppPackage);
m_cSMSCSocketRCV->SMSCSendMsg((char*)&struSmppPackage,16+strlen(szMessageID)+1);
struSMPPSUBMIT struSmppSubmit;
memset(&struSmppSubmit,0,sizeof(struSmppSubmit));
FillStruct(struSMPPackage.szBody,struSMPPackage.struHead.dwCommandLength - 16,&struSmppSubmit);
if(struSmppSubmit.nEsmClass == 4)
{
WaitForSingleObject(m_hEventStatReport,INFINITE);
m_listStatReport.AddTail(struSmppSubmit);
SetEvent(m_hEventStatReport);
m_nStatReportCount++;
ShowStatus(APP_SMPPROTOCOL+STAT_REPORT_COUNT,m_nStatReportCount,NULL);
return 1;
}
WaitForSingleObject(m_hEventDeliver,INFINITE);
m_listDeliver.AddTail(struSmppSubmit);
SetEvent(m_hEventDeliver);
m_nMOCount++;
ShowStatus(APP_SMPPROTOCOL+STAT_MO_COUNT,m_nMOCount,NULL);
return 1;
}
int CSMPProtocol::FillStruct(char* szSourBuff,int nMsgLen,CSMPProtocol::struSMPPSUBMIT* struSmppSubmit)
{
int nLen,nOffset = 0;
nLen = strlen(szSourBuff);
strcpy(struSmppSubmit->szServiceType,szSourBuff);
nOffset += nLen +1;
memcpy(&struSmppSubmit->nSourceAddressTon,szSourBuff + nOffset,2);
nOffset += 2;
nLen = strlen(szSourBuff + nOffset);
strcpy(struSmppSubmit->szSourceAddress,szSourBuff + nOffset);
nOffset += nLen +1;
if((struSmppSubmit->nSourceAddressTon == 1)&&(struSmppSubmit->szSourceAddress[0] == '8'))
strcpy(struSmppSubmit->szSourceAddress,struSmppSubmit->szSourceAddress + 2);
memcpy(&struSmppSubmit->nDestAddressTon,szSourBuff + nOffset,2);
nOffset += 2;
nLen = strlen(szSourBuff + nOffset);
strcpy(struSmppSubmit->szDestAddress,szSourBuff + nOffset);
nOffset += nLen +1;
memcpy(&struSmppSubmit->nEsmClass,szSourBuff + nOffset,3);
nOffset += 3;
nLen = strlen(szSourBuff + nOffset);
strcpy(struSmppSubmit->szScheduleDeliveryTime,szSourBuff + nOffset);
nOffset += nLen +1;
nLen = strlen(szSourBuff + nOffset);
strcpy(struSmppSubmit->szValidityPeriod,szSourBuff + nOffset);
nOffset += nLen +1;
memcpy(&struSmppSubmit->nRegisteredDeliveryflag,szSourBuff + nOffset,5);
nOffset += 5;
nLen = struSmppSubmit->nSmLength;
memcpy(struSmppSubmit->szShortMessageText,szSourBuff + nOffset,nLen);
nOffset += nLen +1;
if(struSmppSubmit->nDataCoding == 8)
UnicodeToStr(struSmppSubmit->szShortMessageText,&nLen);
return 1;
}
int CSMPProtocol::SendSubmitBuff()
{
if(m_listSubmitBuff.IsEmpty())
return 0;
if(!m_nHaveTrnLink)
m_dwStatusTRN = m_dwStatusRCV;
struSMPPACKAGE struSMPPackage;
while((m_dwStatusTRN == HAVE_LOGIN)&&(!m_listSubmitBuff.IsEmpty()))
{
struSMPPackage = m_listSubmitBuff.RemoveHead();
if(!m_cSMSCSocketTRN->SMSCSendMsg((char*)&struSMPPackage,
ntohl(struSMPPackage.struHead.dwCommandLength)))
{
m_dwStatusTRN = LOGIN_BREAKED;
if(!m_nHaveTrnLink)
m_dwStatusRCV = m_dwStatusTRN;
m_listSubmitBuff.AddHead(struSMPPackage);
break;
}
}
//Modify by LiuTianJun on 2001-12-28
if(m_listSubmitBuff.GetCount()>5000)
m_listSubmitBuff.RemoveAll();
return 1;
}
int CSMPProtocol::StrToUnicode(char *buf, int *sm_length)
{
unsigned short buffer[1000];
int len = MultiByteToWideChar(CP_ACP, 0, buf, *sm_length, NULL, 0);
if(len==*sm_length)
return 0;
MultiByteToWideChar(CP_ACP, 0, buf, *sm_length, buffer, len);
//网络字节转换。
for(int i=0; i <len; i++)
buffer[i]=htons(buffer[i]);
memcpy(buf, (char *) buffer, len*sizeof(unsigned short));
*sm_length=len+len;
return 1;
}
void CSMPProtocol::UnicodeToStr(char *buf, int *sm_length)
{
char buffer[512];
unsigned short *p = (unsigned short *)buf;
for(int i=0; i < *sm_length/2; i++,p++) //网络字节转换。
*p = ntohs(*p);
int len = WideCharToMultiByte(CP_ACP, 0, (WCHAR *)buf, *sm_length/2, NULL, 0,NULL,NULL);
WideCharToMultiByte(CP_ACP, 0, (WCHAR *)buf, *sm_length/2, buffer, len,NULL,NULL);
buffer[len]='\0';
strcpy(buf,buffer);
return ;
}
int CSMPProtocol::Print(char* szDisplayMsg)
{
CSMPPAgentDlg* pcDlg;
pcDlg = (CSMPPAgentDlg*) AfxGetMainWnd();
pcDlg->Display(APP_SMPPROTOCOL,szDisplayMsg);
return 1;
}
int CSMPProtocol::ShowStatus(int nType,int nValue,char* szMsg)
{
// WaitForSingleObject(m_hEventShowStat,INFINITE);
//CSMPPAgentDlg* pcDlg;
//pcDlg = (CSMPPAgentDlg*) AfxGetMainWnd();
m_pcDlg->ShowStatus(nType,nValue,szMsg);
// SetEvent(m_hEventShowStat);
return 1;
}
int CSMPProtocol::DealStatReport(CSMPProtocol::struSMPPSUBMIT struSmppSubmit,DWORD* pdwMessageID,DWORD* pdwStatus)
{
struct struSTATREPORT{
char szID[10+1];
char szSub[3+1];
char szDlvrd[4];
char szSubmitDate[11];
char szDoneDate[11];
char szStat[8];
char szErr[4];
char szText[21];
} struStatReport;
char szSourBuff[200];
memset(szSourBuff,0,sizeof(szSourBuff));
memcpy(szSourBuff,struSmppSubmit.szShortMessageText,struSmppSubmit.nSmLength);
int nLen,nOffset = 0;
memset(&struStatReport,0,sizeof(struStatReport));
if(m_nDestSMSC == 1)
{
memcpy(struStatReport.szID,szSourBuff + 3,10);
memcpy(struStatReport.szStat,szSourBuff + 63,7);
}
else if(m_nDestSMSC == 2)
{
//nLen = strlen(szSourBuff);
//strcpy(struStatReport.szID,szSourBuff);
memcpy(struStatReport.szID,szSourBuff + nOffset,10);
nOffset += 10 ;
//nLen = strlen(szSourBuff + nOffset);
//strcpy(struStatReport.szSub,szSourBuff + nOffset);
memcpy(struStatReport.szSub,szSourBuff + nOffset,3);
nOffset += 3;
memcpy(struStatReport.szDlvrd,szSourBuff + nOffset,3);
nOffset += 3;
memcpy(struStatReport.szSubmitDate,szSourBuff + nOffset,10);
nOffset += 10;
memcpy(struStatReport.szDoneDate,szSourBuff + nOffset,10);
nOffset += 10;
memcpy(struStatReport.szStat,szSourBuff + nOffset,7);
nOffset += 7;
memcpy(struStatReport.szErr,szSourBuff + nOffset,3);
nOffset += 3;
memcpy(struStatReport.szText,szSourBuff + nOffset,20);
nOffset += 20;
}
CString strStat;
strStat.Format("%s",struStatReport.szStat);
*pdwMessageID = atol(struStatReport.szID);
CStringArray strarrStat;
strarrStat.InsertAt(0,"DELIVRD");
strarrStat.InsertAt(1,"EXPIRED");
strarrStat.InsertAt(2,"DELETED");
strarrStat.InsertAt(3,"UNDELIV");
strarrStat.InsertAt(4,"ACCEPTD");
strarrStat.InsertAt(5,"UNKNOWN");
strarrStat.InsertAt(6,"REJECTED");
for(int i=0; i<=6; i++)
{
if(strarrStat.GetAt(i) == strStat)
break;
}
if(i == 7)
{ // add by juncom on 12/18/2001,为了支持天津联通机房的短信中心
strarrStat.RemoveAll();
strarrStat.InsertAt(0,"0000001");
strarrStat.InsertAt(1,"0000002");
strarrStat.InsertAt(2,"0000003");
strarrStat.InsertAt(3,"0000004");
strarrStat.InsertAt(4,"0000005");
strarrStat.InsertAt(5,"0000006");
strarrStat.InsertAt(6,"0000007");
for(i=0; i<=6; i++)
{
if(strarrStat.GetAt(i) == strStat)
break;
}
if (i == 5)
i = 0;
}
*pdwStatus = i;
if(struStatReport.szStat[0] =='\0')
*pdwStatus = 0;
return 1;
}
int CSMPProtocol::HexToDec(char* szHexNum)
{
int nCount,nQuoto,nDecNum,nTemp;
char szTemp[2];
memset(szTemp,0,sizeof(szTemp));
nCount = strlen(szHexNum);
nQuoto = 1;
nDecNum = 0;
for(int i = nCount-1; i>=0;i--)
{
szTemp[0] = szHexNum[i];
nTemp = atol(szTemp);
switch(szTemp[0])
{
case 'a':
case 'A':
nTemp = 10;
break;
case 'b':
case 'B':
nTemp = 11;
break;
case 'c':
case 'C':
nTemp = 12;
break;
case 'd':
case 'D':
nTemp = 13;
break;
case 'e':
case 'E':
nTemp = 14;
break;
case 'f':
case 'F':
nTemp = 15;
break;
}
nQuoto *=16;
if (i == nCount-1)
nQuoto = 1;
nDecNum += nTemp*nQuoto;
}
return nDecNum;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -