📄 dncmppdeal.cpp.bak
字号:
/**********************************************************************
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 + -