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

📄 msg_center.cpp

📁 短信网管的原代码。用于与sp通信
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"
#include "Msg_Center.h"
#include "shlwapi.h"
#include "StrSplitter.h"
#include "common.h"
#include "ZUDPSocket.h"

#define FUJIAN

int iRecvSock=0;

extern char gszAddPackets[128][32];
extern char gszExchangeFees[128][32];

extern CZUDPSocket* g_pUDPSocket;
extern DWORD g_dwLogin;
DWORD WINAPI PeekMsgThread(LPVOID lpParam)
{
	char bMsg[1024];
	TMSG_CENTER* pMsgCenter=(TMSG_CENTER*)lpParam;
	
	while(true)
	{
		memset(bMsg,0x00,1024);
		if(pMsgCenter->CmppEntity.MsgQue.pop(bMsg))
			pMsgCenter->CmppLink_MsgProc(bMsg);

		memset(bMsg,0x00,1024);
		if(g_dwLogin == 1)
			if(pMsgCenter->PtEntity.MsgQue.pop(bMsg))
				pMsgCenter->Pt_MsgProc(bMsg);

		Sleep(10);
	}
}

void  TMSG_CENTER::Pt_MsgProc(char *buf)
{
	STRUCT_TRP_MSG_HEADER *TRp_msg_head=(STRUCT_TRP_MSG_HEADER *)buf;
	UINT nCommandID=ntohl(TRp_msg_head->dwCommandId);
	int nMsgLen=ntohl(TRp_msg_head->dwTotalLen);

	LogMsg(buf);//数出输出消息
	switch(nCommandID)
	{
		case TRP_SUBMIT:
			MtAdd();
			PT_Submit(buf,nMsgLen);
			break;
		case TRP_QUERY:
			PT_Query(buf,nMsgLen);
			break;
		default:
			LogErr("CMPP UNKNOWN_UNIDATA PACKET from PT!\r\n");
		break;
	}
    return;
}

BOOL  TMSG_CENTER::PT_Submit(char buf[],UINT nbufLen)
{
	//检查数据包是否正确
	if(buf==NULL || nbufLen<=0)
		return FALSE;

	char szUDPTmp[1024];
	ZeroMemory(szUDPTmp,sizeof(szUDPTmp));
	strcpy(szUDPTmp,gStructSmscInfo.szRemark);
	memcpy(&szUDPTmp[60],buf,nbufLen);
	g_pUDPSocket->SendTo(szUDPTmp,nbufLen+60,gStructWatchInfo.szIP,gStructWatchInfo.nPort);
	ZeroMemory(szUDPTmp,sizeof(szUDPTmp));
	memcpy(szUDPTmp,buf,nbufLen);
	int nUDPTmp = nbufLen;
	//内部传送的大包包头
	STRUCT_SUBMIT_HEADER *struct_submit_head=(STRUCT_SUBMIT_HEADER*)buf;
	
	//发送的cmpp结构
	STRUCT_CMPP12_SUBMIT struct_cmpp_submit;
	ZeroMemory(&struct_cmpp_submit,sizeof(STRUCT_CMPP12_SUBMIT));

	memcpy(&struct_cmpp_submit,&buf[sizeof(STRUCT_SUBMIT_HEADER)],ntohs(struct_submit_head->wProtocol_Length));

	//CMPP数据包的缓冲区
	char szcmppdata[1024];
	ZeroMemory(&szcmppdata,sizeof(szcmppdata));

//	ZeroMemory(&struct_cmpp_submit.szSrc_terminal_id,21);
//	strcpy(struct_cmpp_submit.szSrc_terminal_id,gStructSmscInfo.szServiceNo);

	//包长度最后处理...(在别的函数中处理)
	//处理消息编码
	switch(struct_cmpp_submit.cMsg_Fmt)
	{
	case 0:
		{
		}break;
	case 2://PDU
	case 246:
		{
			WORD msglen=struct_cmpp_submit.wMsg_Length;
			msglen = ntohs(msglen);
			char tem;		
			struct_cmpp_submit.szMsg_Content[msglen]='\0';
			//转换为大写
			_strupr(struct_cmpp_submit.szMsg_Content);
			//检查PDU的编码合法性
			int maxlen=strlen(struct_cmpp_submit.szMsg_Content);
			for(int i=0;i<maxlen;i++)
			{
				tem=struct_cmpp_submit.szMsg_Content[i];
				if((tem<'0')||((tem>'9')&&(tem<'A'))||(tem>'H'))
				{
					LogErr("收到的PDU码有误,无法转换");
					return FALSE;
				}
			}
			//转换为二进制码
			convPDUToBin( struct_cmpp_submit.szMsg_Content, &msglen );
			struct_cmpp_submit.cMsg_Fmt = 2;
			struct_cmpp_submit.wMsg_Length = htons(msglen);
			struct_cmpp_submit.sHeader.dwTotal_Length= 132 + msglen;
		}break;
	case 4://二进制码,不转,直接传送
		{
		}
		break;
	case 8:	//汉字UNICODE编码
		{
			//不转换,直接透传
		}break;
	case 15://CMPP 的GB汉字
		{
			struct_cmpp_submit.cMsg_Fmt = 15;
			//unsigned char msglen=( unsigned char )ntohs(struct_cmpp_submit.wMsg_Length);
			//convCToUnicode(struct_cmpp_submit.szMsg_Content,&msglen);
			//struct_cmpp_submit.wMsg_Length=msglen;
		}break;
	default:
		LogErr("<--P 收到的消息编码有误,无法识别");
		return FALSE;		
	}
	UINT bufLen = struct_cmpp_submit.sHeader.dwTotal_Length;
	struct_cmpp_submit.sHeader.dwTotal_Length = htonl(bufLen);

	//是否要状态报告,取大包数据
	//struct_cmpp_submit.cRegistered_Delivery=struct_submit_head->cCredibility_Transmit;
	if(struct_cmpp_submit.cRegistered_Delivery!=2)
		struct_cmpp_submit.cRegistered_Delivery=struct_submit_head->cCredibility_Transmit;

	//优先级,取大包的
	struct_cmpp_submit.cMsg_Level=struct_submit_head->cPriority_Flag;
	//原电话号码
	if(strlen(struct_cmpp_submit.szSrc_terminal_id)==0)
		strcpy(struct_cmpp_submit.szSrc_terminal_id,gStructSmscInfo.szServiceNo);

	//组成CMPP12包
	//bufLen=MakeCMPP12Buf(szcmppdata,&struct_cmpp_submit,CMPP12_SUBMIT);

	SUBMIT submit;
    ZeroMemory(&submit,sizeof submit);
	submit.sHeader.Command_ID=htonl(0x3);

	//changed by shijijiang
	//福建联通协议SGIP1.2,按SGIP协议添加序列号。原节点编号(4字节)+时间(12字节)+序号(4字节)
    //第一部分
    //原节点编号 3AAAAQQQQQ    3055122003 福建区号0591  特符号 23008
	//submit.sHeader.Sequence_ID.srcseq=htonl(0xb4e82629); //原节点编号:3059123008
	submit.sHeader.Sequence_ID.srcseq=htonl(3059123008); //原节点编号:3059123008
    //第二部分:时间
	time_t datetime;
	time( &datetime );
	char temp[12];
	strftime(&temp[0], 12, "%m%d%H%M%S",localtime(&datetime));
	unsigned long ldatetime;
	ldatetime=atol(temp);
	submit.sHeader.Sequence_ID.systime=htonl(ldatetime);
	
	//第三部分:序号
	submit.sHeader.Sequence_ID.seq = struct_submit_head->sHeader.dwSeqNo;

	memcpy(submit.SPNumber,struct_cmpp_submit.szSrc_terminal_id,21);
	if(struct_cmpp_submit.szDest_terminal_ids[0]=='8')
		memcpy(submit.ChargeNumber,struct_cmpp_submit.szDest_terminal_ids,15);
	else
	{
		memcpy(submit.ChargeNumber,"86",2);
		memcpy(&submit.ChargeNumber[2],struct_cmpp_submit.szDest_terminal_ids,12);
	}
	submit.UserCount=1;
 	memcpy(submit.UserNumber,submit.ChargeNumber,15);

	memcpy(submit.CorpId,gStructSmscInfo.szCorpID,5);//???
	memcpy(submit.ServiceType,struct_cmpp_submit.szService_ID,10);
	char szTemp[10];
	ZeroMemory(szTemp, sizeof(szTemp));
	strncpy(szTemp,struct_cmpp_submit.szFeeType,2);
	submit.FeeType = (BYTE)(atoi(szTemp));
	memcpy(submit.FeeValel,struct_cmpp_submit.szFeeCode,6);

	//???待定
	submit.GivenValue;//
	submit.AgentFlag;//
	submit.Priority;//
	//???待定
	//腾瑞通协议更改见协议类型转义
	submit.MorelatetoMTflag = struct_submit_head->cProtocol_Type >> 4;

	memcpy(&submit.ExpireTime[0],struct_cmpp_submit.szValid_Time,16);//
	memcpy(&submit.ScheduleTime[0],struct_cmpp_submit.szAt_Time,16);//
	submit.ReportFlag=2;
	submit.TP_pid = struct_cmpp_submit.cTP_pid;//
	submit.TP_udhi = struct_cmpp_submit.cTP_udhi;//
	submit.MessageCoding=struct_cmpp_submit.cMsg_Fmt;
	submit.MessageType;//
	submit.MessageLength=htonl((long)ntohs(struct_cmpp_submit.wMsg_Length));
//	submit.MessageLength=(long)cmpp_sub.Msg_Length;
	memcpy(submit.MessageContent,struct_cmpp_submit.szMsg_Content,160);
	submit.Reserve;//
	int y=sizeof(submit)-sizeof(submit.MessageContent)+ntohl(submit.MessageLength);
	submit.sHeader.Total_Length=htonl(y);
	memset(submit.Reserve, '\0', sizeof(submit.Reserve));
	memcpy(submit.Reserve, struct_cmpp_submit.szReserve, sizeof(struct_cmpp_submit.szReserve));
	if(struct_cmpp_submit.cRegistered_Delivery == 2)
	{
		submit.ReportFlag = 3;
	}
	else if(struct_cmpp_submit.cRegistered_Delivery == 1)
	{
		submit.ReportFlag = 1;
	}
	else if(struct_cmpp_submit.cRegistered_Delivery == 0)
	{
		submit.ReportFlag = 2;
	}

	{
		char s[1000];
		sprintf(s, "MOFlag:%d REFlag:%d FeeType:%d FeeValue:%06s", submit.MorelatetoMTflag, submit.ReportFlag, submit.FeeType, submit.FeeValel);
		LogErr(s);
	}

#ifdef FUJIAN
//	if(submit.ServiceType[0] != '-')
//		submit.MorelatetoMTflag = 1;

	if(stricmp((char*)submit.ServiceType,"-YJ") == 0)
		//李健修改 手机信箱6元改5元
		//strcpy((char*)submit.FeeValel,"000600");
		strcpy((char*)submit.FeeValel,"000500");
#endif
/*	for(int i=0;i<127;i++)
	{
		if(strcmp(gszExchangeFees[i],"END") == 0)
			break;
		if(strncmp(gszExchangeFees[i],(char*)submit.ServiceType,strlen(gszExchangeFees[i])) == 0)
		{
			if(struct_cmpp_submit.cRegistered_Delivery == 2)
			{
				strncpy((char*)submit.FeeValel,&gszAddPackets[i][strlen(gszAddPackets[i])+1],6);
				break;
			}
		}
	}*/
	TRACE("SEQ:%d\r\n",submit.sHeader.Sequence_ID.seq);
	//发送短消息到短信中心
	if(CmppEntity.SendToTcp((char*)&submit,ntohl(submit.sHeader.Total_Length)) == FALSE)
	{
		CmppEntity.MsgQue.push(szUDPTmp,nUDPTmp);
		return FALSE;
	}
	return TRUE;
}

//短消息查询数据包,平台2.1实现,协议版本2.2实现查询操作
BOOL  TMSG_CENTER::PT_Query(char buf[],UINT nbufLen)
{
	return FALSE;
}

void TMSG_CENTER::SgipServer_MsgProc(char *buf)
{
	SGIP_MSGHEAD *sgip_msg_head=(SGIP_MSGHEAD*)buf;
	UINT nCommandID=sgip_msg_head->Command_ID;
	int nMsgLen=ntohl(sgip_msg_head->Total_Length);

	LogMsg(buf);//数出输出消息
	switch(ntohl(nCommandID))
	{
		case SGIP_DELIVERY:
			MoAdd();
			SGIP_Deliver(buf,nMsgLen);
			break;
		case SGIP_REPORT:
			SGIP_Report(buf,nMsgLen);
			break;
		default:
			TRACE("ERROR COMMAND");
			break;
	}	
	return ;
}

void TMSG_CENTER::CmppLink_MsgProc(char *buf)
{
	//因为网关的ZSOCKET是网络字节,所以要转换成主机字节
	STRUCT_CMPP12_MSG_HEADER *cmpp_msg_head=(STRUCT_CMPP12_MSG_HEADER*)buf;
	UINT nCommandID=cmpp_msg_head->dwCommand_ID;
	int nMsgLen=ntohl(cmpp_msg_head->dwTotal_Length);

	LogMsg(buf);//数出输出消息
	switch(ntohl(nCommandID))
	{
		case CMPP12_DELIVERY:
			MoAdd();
			CMPP12_Deliver(buf,nMsgLen);
			break;
		case CMPP12_SUBMIT_REP:
			CMPP12_SubmitRep(buf,nMsgLen);
			break;
		case CMPP12_QUERY_REP:
			CMPP12_QueryRep(buf,nMsgLen);
			break;
		default:
			TRACE("ERROR COMMAND");
			break;
	}	
	return ;
}

//#define HF_CHANNEL

//短信下发消息
BOOL TMSG_CENTER::CMPP12_Deliver(void* buf,UINT nBufLen)
{
	//检查数据包是否正确
	if(buf==NULL || nBufLen<=0)
		return FALSE;

	char* pbuf=(char*)buf;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -