📄 upmakersppack.cpp
字号:
/********************************************************************** FileName : UpMakeRspPack.cpp Description : 上端应答包构造模块 Version : 1.0 Date : 2003年6月19日 Author : 刘荣辉 Other : 根据协议类型调用相应协议包构造模块***********************************************************************/#include "UpNode.h"//int MakeSMGPRsp(void *ReqPack, void **RspPack);//int MakeCMPPRsp(void *ReqPack, void **RspPack);//*ReqPack为请求包的指针,在本函数内动态分配内存来存储构造的应答包,//通过指针的指针**RspPack传递应答包的地址//应答包所占内存的释放必须在本函数返回后进行//=====================================================================================int CUpNode::MakeRspPack(void *ReqPack, void **RspPack){ int RetCode; if(Protocol==0) { RetCode=MakeCMPPRsp(ReqPack, RspPack); //形成CMPP应答包,返回值为状态码 } else if(Protocol==1) { RetCode=MakeSMGPRsp(ReqPack, RspPack); //形成SMGP应答包,返回值为状态码 } return RetCode;}//=====================================================================================//==================================SMGP应答包构造模块=================================//=====================================================================================int CUpNode::MakeSMGPRsp(void *ReqPack, void **RspPack){ unsigned int PackType; int Status; int Result; char timebuf[16]; Status = 0; //作为参数值返回,据此来判断是否重连,不重连时其值与Result相同 Result = 0; //需要返回的应答包的状态码 /*//------------------debug--------------------------- printf("\n===========MakeSMGPRsp============= \n"); unsigned char *ptmp; ptmp=(unsigned char *)ReqPack; int len; len = ntohl(*(int *)ReqPack); printf("PackLen=[%d]\n",len); for(int i=0;i<len;i++) { printf("%02x ",*(ptmp+i)); if(((i+1)%4)==0) printf(" "); if((i+1)==12) printf("\n"); } printf("\n=========================================== \n"); //------------------debug end---------------------------*/ PackType = ntohl(*(unsigned int *)((char *)ReqPack+4)); switch(PackType) { case REQUEST_ID_DELIVER: { SMGP_Deliver * tReqPack = (SMGP_Deliver *)ReqPack; //数据包(Deliver)合法性检查 if(ntohl(tReqPack->msgHead.nPacketLength) > sizeof(SMGP_Deliver)) { Result=36; //非法短消息长度 Status=999; //需要重新建立连接 break; } //???????其他字段的检查???????? else if(0) { } if((ShowLog==3) || (ShowLog==1)) //显示收到的Deliver包 { WrSystemLog->getTime(timebuf); printf("\n===================收到SMGP_Deliver包==================\n"); printf("接收时间:%s\n用户手机号:%s\n目的号码:%s\n短信内容:%s",timebuf,tReqPack->sSrcTermId,tReqPack->sDestTermId,tReqPack->Deliver_Msg.sMsgContent); printf("\n=======================================================\n"); } //printf("\n MsgLen=[%d].\n",tReqPack->nMsgLength); tReqPack->nMsgLength = ntohl(tReqPack->msgHead.nPacketLength) + sizeof(tReqPack->Deliver_Msg) - sizeof(SMGP_Deliver); //printf("\n MsgLen=[%d].\n",tReqPack->nMsgLength); //形成应答包(Deliver_Rsp) SMGP_DeliverResp * tRspPack = (SMGP_DeliverResp *)malloc(sizeof(SMGP_DeliverResp)); tRspPack->msgHead.nPacketLength = htonl(sizeof(SMGP_DeliverResp)); tRspPack->msgHead.nRequestId = htonl(REQUEST_ID_DELIVER_RESP); tRspPack->msgHead.nSequenceId = tReqPack->msgHead.nSequenceId; memcpy(tRspPack->sMsgId , tReqPack->sMsgId, sizeof(tRspPack->sMsgId)); tRspPack->nResult = Status; *RspPack = (void *)tRspPack; break; } case REQUEST_ID_ACTIVE_TEST: { SMGP_Head * tReqPack = (SMGP_Head *)ReqPack; //数据包(Deliver)合法性检查 if(ntohl(tReqPack->nPacketLength) != sizeof(SMGP_Head)) { Result=36; //非法短消息长度 Status=999; //需要重新建立连接 break; } //形成应答包(Deliver_Rsp) SMGP_Head * tRspPack = (SMGP_Head *)malloc(sizeof(SMGP_Head)); tRspPack->nPacketLength = htonl(sizeof(SMGP_Head)); tRspPack->nRequestId = htonl(REQUEST_ID_ACTIVE_TEST_RESP); tRspPack->nSequenceId = tReqPack->nSequenceId; *RspPack = (void *)tRspPack; free(ReqPack); //释放请求包所占内存,Active_Test包至此处理完毕 Status = 1; //Active_Test包至此处理完毕,不再放进接收队列中 break; } case REQUEST_ID_EXIT: //能否马上返回应答包????? { //*RspPack = (void *)tRspPack; Status=1000; //需要重新建立连接 *RspPack = NULL; break; } default : { Result=11; //命令字错 Status=999; //需要重新建立连接 //*RspPack = (void *)tRspPack; *RspPack = NULL; break; } }//switch() return Status;}//=====================================================================================//==================================CMPP应答包构造模块=================================//=====================================================================================int CUpNode::MakeCMPPRsp(void *ReqPack, void **RspPack){ unsigned int PackType; int Status; int Result; //char timebuf[16]; Status = 0; //作为参数值返回,据此来判断是否重连,不重连时其值与Result相同 Result = 0; //需要返回的应答包的状态码 PackType = ntohl(*(unsigned int *)((char *)ReqPack+4)); switch(PackType) { case CMPP_DELIVER: { CMPP_Deliver * tReqPack = (CMPP_Deliver *)ReqPack; //数据包(Deliver)合法性检查 if(ntohl(tReqPack->Head.Total_Length) > sizeof(CMPP_Deliver)) { Result=6; //超过最大信息长 Status=999; //需要重新建立连接 break; } //???????其他字段的检查???????? else if(0) { } /* if((ShowLog==3) || (ShowLog==1)) //显示收到的Deliver包 { WrSystemLog->getTime(timebuf); printf("\n===================收到CMPP_Deliver包==================\n"); printf("接收时间:%s\n用户手机号:%s\n目的号码:%s\n短信内容:%s",timebuf,tReqPack->Src_terminal_Id,tReqPack->Dest_Id,tReqPack->Deliver_Msg.Msg_Content); printf("\n=======================================================\n"); } */ //printf("\n UP MsgLen=[%d].\n",tReqPack->Msg_Length); tReqPack->Msg_Length = ntohl(tReqPack->Head.Total_Length) + sizeof(tReqPack->Deliver_Msg) - sizeof(CMPP_Deliver); //printf("\n UP MsgLen=[%d].\n",tReqPack->Msg_Length); //形成应答包(Deliver_Rsp) CMPP_Deliver_Resp * tRspPack = (CMPP_Deliver_Resp *)malloc(sizeof(CMPP_Deliver_Resp)); tRspPack->Head.Total_Length = htonl(sizeof(CMPP_Deliver_Resp)); tRspPack->Head.Command_Id = htonl(CMPP_DELIVER_RESP); tRspPack->Head.Sequence_Id = tReqPack->Head.Sequence_Id; //memcpy(tRspPack->Msg_Id , tReqPack->Msg_Id, sizeof(tRspPack->Msg_Id)); tRspPack->Msg_Id = tReqPack->Msg_Id; tRspPack->Result = Status; *RspPack = (void *)tRspPack; break; } case CMPP_ACTIVE_TEST: { CMPP_Active_Test * tReqPack = (CMPP_Active_Test *)ReqPack; //数据包(Deliver)合法性检查 if(ntohl(tReqPack->Total_Length) != sizeof(CMPP_Active_Test)) { Result=4; //消息长度错 Status=999; //需要重新建立连接 break; } //形成应答包(Deliver_Rsp) CMPP_Active_Test_Resp * tRspPack = (CMPP_Active_Test_Resp *)malloc(sizeof(CMPP_Active_Test_Resp)); tRspPack->Head.Total_Length = htonl(sizeof(CMPP_Active_Test_Resp)); tRspPack->Head.Command_Id = htonl(CMPP_ACTIVE_TEST_RESP); tRspPack->Head.Sequence_Id = tReqPack->Sequence_Id; *RspPack = (void *)tRspPack; free(ReqPack); //释放请求包所占内存,Active_Test包至此处理完毕 Status = 1; //Active_Test包至此处理完毕,不再放进接收队列中 break; } case CMPP_TERMINATE: //能否马上返回应答包????? { //*RspPack = (void *)tRspPack; //printf("\n MakeCMPPRsp: Got a CMPP_TERMINATE! Connection is to be lost!\n"); Status=1000; //需要重新建立连接 *RspPack = NULL; break; } //------------------------来自下节点的请求包------------------------ case CMPP_CONNECT: { //*RspPack = (void *)tRspPack; *RspPack = NULL; break; } case CMPP_SUBMIT: { //*RspPack = (void *)tRspPack; *RspPack = NULL; break; } case CMPP_QUERY: //能否马上返回应答包????? { //*RspPack = (void *)tRspPack; *RspPack = NULL; break; } case CMPP_CANCEL: //能否马上返回应答包????? { //*RspPack = (void *)tRspPack; *RspPack = NULL; break; } default : { Result=11; //命令字错 Status=999; //需要重新建立连接 //*RspPack = (void *)tRspPack; *RspPack = NULL; break; } }//switch() return Status;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -