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

📄 dncmppdeal.cpp.bak

📁 SMS gateway. SMS protocol for CHINA mobile, unicom, lingtong. Using mysql to exchange message.
💻 BAK
📖 第 1 页 / 共 2 页
字号:
/**********************************************************************
  FileName            : DnCMPPDeal.cpp
  Description         : 下端收到的CMPP包的路由处理(线程)函数
  Version             : 1.0
  Date                : 2003年9月19日
  Author              : 刘荣辉
  Other               : MT路由转发/写日志/写数据库
***********************************************************************/

#include "GateWay.h"

//==========================================================================
//===========================下端MT包的路由处理=============================
//==========================================================================
void * CGateWay::DnCMPPDeal(RecvQUnit * pUnit, CDnNode *DnNode)
{
	int PackType;
	int Sequence;
	int UpNum;
	char timebuf[16];
	struct tm *tmptime;
	time_t nowtime;
    char sSysEvent[SYS_EVENT_LEN];
	//CFunc MyFun;

	WrSystemLog->getTime(timebuf);
    time(&nowtime);
	PackType = ntohl(*(int *)(pUnit->Pack + 4));
	Sequence = ntohl(*(int *)(pUnit->Pack + 8));

	switch(PackType)
	{
		case CMPP_SUBMIT:
		{
			CMPP_Submit *pSubmit;
			pSubmit = (CMPP_Submit *)pUnit->Pack;

			//------编码格式转换Unicode->GBK,并修改消息长度和包长度------
			if(pSubmit->Msg_Fmt==8)
			{
				int OldMsgLen;
				OldMsgLen = pSubmit->Msg_Length;
				pSubmit->Msg_Fmt=15;
				//pSubmit->Msg_Length = CFunc::CodeConvert("Unicode","GBK",pSubmit->Msg_Content,pSubmit->Msg_Content,pSubmit->Msg_Length);
				pSubmit->Msg_Length = CFunc::CodeConvert("UTF-16BE","GBK",pSubmit->Msg_Content,pSubmit->Msg_Content,pSubmit->Msg_Length);
				pSubmit->Head.Total_Length = htonl(ntohl(pSubmit->Head.Total_Length) + pSubmit->Msg_Length - OldMsgLen);
			}
			if((DnNode->ShowLog==3) || (DnNode->ShowLog==1))	//显示收到的Submit包
			{
				printf("\n==============收到CP发来的短信============\n");
				printf("接收时间:%s\nCP服务代码:%s\n目的手机号码:%s\n短信内容:%s",timebuf,pSubmit->Src_Id,pSubmit->Dest_terminal_Id,pSubmit->Msg_Content);
				printf("\n============================================ \n");
			}

			//----------------根据号段映射表查出目的上节点编号-------------------
			int DestUpNode;
			char PhoneHead[10];
			strncpy(PhoneHead,pSubmit->Dest_terminal_Id,MT_SEGMENT_LEN);
			long long iPhoneHead = atoll(PhoneHead);

			IntIntMap::iterator UnitPos;
			UnitPos = MtRoute_Map.find(iPhoneHead);
			if (UnitPos == MtRoute_Map.end()) //没找到MT路由
			{
				sprintf(sSysEvent," Warning: Unexpected Dest_terminal_Id[%s] in CMPP_Sumbit from DnNode[%d], Abandoned!\n",pSubmit->Dest_terminal_Id,DnNode->NodeID);
				WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); 
				free(pUnit->Pack);	//释放接收包所占内存,在TCPsocket::RecvPack()中malloc
				free(pUnit);	//释放接收单元所占内存,在CGateWay::Dn_RecvQ_Poller()中malloc
				return (void *)NULL;
			}
			else
			{
				DestUpNode = UnitPos->second;
				#ifdef DEBUG
				printf("\n DnCMPPDeal: MtRoute_Map: %lld=>%d. \n",iPhoneHead,DestUpNode);
				#endif
			}

			for(UpNum=0;UpNum<UPNODE_NUM;UpNum++)	//查找目的上节点
			{
				if(UpNode[UpNum].NodeID==DestUpNode)
					break;
			}
			if(UpNum==UPNODE_NUM)	//不存在相应的目的上节点
			{
				//发给默认网关???????????????

				sprintf(sSysEvent,"\n Warning: DestUpNode[%d] does NOT exit! A CMPP_Sumbit from DnNode[%d], Abandoned",DestUpNode,DnNode->NodeID);
				WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); 
				free(pUnit->Pack);	//释放接收包所占内存,在TCPsocket::RecvPack()中malloc
				free(pUnit);	//释放接收单元所占内存,在CGateWay::Dn_RecvQ_Poller()中malloc
				return (void *)NULL;
			}

			//----------------------------MT包的修正----------------------------
			pSubmit->Registered_Delivery = 1;
			pSubmit->Msg_level = 0;
			memcpy(pSubmit->Msg_src,UpNode[UpNum].SP_Id,sizeof(pSubmit->Msg_src));
			memcpy(pSubmit->FeeType,DnNode->FeeType,sizeof(pSubmit->FeeType));
			memcpy(pSubmit->FeeCode,DnNode->FeeCode,sizeof(pSubmit->FeeCode));
			memset(pSubmit->ValId_Time,0,sizeof(pSubmit->ValId_Time));
			memset(pSubmit->At_Time,0,sizeof(pSubmit->At_Time));
			memset(pSubmit->Reserve,0,sizeof(pSubmit->Reserve));
			//-------------------------------------------------------------------

			int QisFull=0;
			//路由转发给上节点
			if(UpNode[UpNum].State==0)	//目的上节点连接正常
			{
				//构造发送队列单元
				SendQUnit  SUnit;
				SUnit.Pack = (char *)pSubmit;
				SUnit.SrcRecvTime = pUnit->RecvTime;
				SUnit.SrcNode = DnNode->NodeID;
				//SUnit.SrcSequence = pSubmit->Head.Sequence_Id;	//原始请求包流水号
				memcpy(&SUnit.ID_Relate , &pUnit->MsgId_Echo, sizeof(SUnit.ID_Relate));
				SUnit.SendTime = nowtime;
				SUnit.iResent = CMPP_SEND_RETRIES;
				//SUnit.Protocol = CMPP_PROTOCOL;
				SUnit.RelayTimes = 0;
				//修改Submit包,放入目的下节点的发送队列
				pSubmit->Head.Sequence_Id = htonl(UpNode[UpNum].GetSequence());
				//UpNode[UpNum].SendQ->Wait_Put(SUnit);
				if(UpNode[UpNum].SendQ->Put(SUnit)==false)
				{
					QisFull=1;	//目的上节点的发送队列已满,暂存数据库
					sprintf(sSysEvent,"Warning: SendQ of UpNode[%s] is full, A Pack is rejected!",UpNode[UpNum].NodeCode);
					WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); 
				}
				#ifdef DEBUG
				printf("\n DnCMPPDeal: A Submit is put into SendQ of UpNode[%s] .\n",UpNode[UpNum].NodeCode);
				#endif
			}

			//目的上节点目前连接不正常,或者目的上节点的发送队列已满
			if(UpNode[UpNum].State!=0 || QisFull)
			{
				//-----------构造CMPP_Submit下行转发记录-------------
				Cmpp_MT_Log MtLog;
				tmptime	= localtime( &pUnit->RecvTime);
				sprintf( MtLog.SrcRecvTime, "%d%02d%02d%02d%02d%02d",
					tmptime->tm_year + 1900,
					tmptime->tm_mon	+ 1,
					tmptime->tm_mday,
					tmptime->tm_hour,
					tmptime->tm_min,
					tmptime->tm_sec);
				MtLog.SrcNode = DnNode->NodeID;
				//MtLog.SrcSequence = pSubmit->Head.Sequence_Id;	//原始请求包流水号
				memcpy(&MtLog.MsgId_Echo, &pSubmit->Msg_Id, sizeof(MtLog.MsgId_Echo));
				MtLog.DestNode = UpNode[UpNum].NodeID;
				time_t Schedule = (int)pUnit->RecvTime + Relay_Interval;						
				tmptime	= localtime( &Schedule);
				sprintf( MtLog.SentTime, "%d%02d%02d%02d%02d%02d",
					tmptime->tm_year + 1900,
					tmptime->tm_mon	+ 1,
					tmptime->tm_mday,
					tmptime->tm_hour,
					tmptime->tm_min,
					tmptime->tm_sec);
				if(UpNode[UpNum].State!=0)
					(char)MtLog.Result = CONN_ABNORMAL;
				else if(QisFull)
					(char)MtLog.Result = SENDQ_FULL;
				MtLog.Submit = pSubmit;
				MtLog.RelayTimes = 0;
				//--------写入下行转发记录缓存表--------
				MyDB->WrMT_Queue(&MtLog, CMPP_PROTOCOL,TAB_MT_Queue);
				sprintf(sSysEvent,"Warning: A CMPP_Submit to UpNode[%d] is saved to MT_Queue temporarily!",UpNode[UpNum].NodeID);
				WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); 
			}
			break;
		}
		//================================================================
		case CMPP_DELIVER_RESP:
		{
			CMPP_Deliver_Resp *pDeliverRsp;
			pDeliverRsp = (CMPP_Deliver_Resp *)pUnit->Pack;

			//从已发送队列中找出并删除对应的等应答的单元
			SendQUnit SUnit;
			if(DnNode->SentQ.FindDel(ntohl(pDeliverRsp->Head.Sequence_Id), &SUnit) == false)
			{
				sprintf(sSysEvent," Error: DnCMPPDeal Can't find the corresponding CMPP_Deliver Pack[%d]!\n",ntohl(pDeliverRsp->Head.Sequence_Id));
				WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); 
				free(pUnit->Pack);	//释放接收包所占内存,在TCPsocket::RecvPack()中malloc
				break;	//放弃处理此包
			}
			
			CMPP_Deliver *pDeliver = (CMPP_Deliver *)SUnit.Pack;
			//----------构造CMPP_Deliver上行转发记录-----------
			Cmpp_MO_Log MoLog;
			tmptime	= localtime( &SUnit.SrcRecvTime);
			sprintf( MoLog.SrcRecvTime, "%d%02d%02d%02d%02d%02d",
				tmptime->tm_year + 1900,
				tmptime->tm_mon	+ 1,
				tmptime->tm_mday,
				tmptime->tm_hour,
				tmptime->tm_min,

⌨️ 快捷键说明

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