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

📄 smpprotocol.cpp

📁 模拟手机源程序,做短信系统(源码)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		{
			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 + -