📄 dnmakersppack.cpp
字号:
/**********************************************************************
FileName : DnMakeRspPack.cpp
Description : 下端应答包构造模块
Version : 1.0
Date : 2003年9月15日
Author : 刘荣辉
Other :
***********************************************************************/
#include "DnNode.h"
//#include "GateWay.h"
int CDnNode::MakeRspPack(void *ReqPack, void **RspPack)
//int CGateWay::MakeRspPack(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_CONNECT:
{
CMPP_Connect * tReqPack = (CMPP_Connect *)ReqPack;
//数据包(Deliver)合法性检查
if(ntohl(tReqPack->Head.Total_Length) > sizeof(CMPP_Connect))
{
Result=6; //超过最大信息长
Status=999; //需要重新建立连接
break;
}
//MD5认证码的检查???????????????????????????
else if(0)
{
}
//形成应答包(CMPP_Connect_Resp)
CMPP_Connect_Resp * tRspPack = (CMPP_Connect_Resp *)malloc(sizeof(CMPP_Connect_Resp));
tRspPack->Head.Total_Length = htonl(sizeof(CMPP_Connect_Resp));
tRspPack->Head.Command_Id = htonl(CMPP_CONNECT_RESP);
tRspPack->Head.Sequence_Id = tReqPack->Head.Sequence_Id;
tRspPack->Status = Result;
//形成ISMG认证码??????????????????????????????
//memcpy(tRspPack->AuthenticatorISMG,);
tRspPack->Version = CMPPVersion;
*RspPack = (void *)tRspPack;
break;
}
//------------------------------------------------
case CMPP_SUBMIT:
{
CMPP_Submit * tReqPack = (CMPP_Submit *)ReqPack;
//数据包合法性检查
if(ntohl(tReqPack->Head.Total_Length) > sizeof(CMPP_Submit))
{
Result=6; //超过最大信息长
Status=999; //需要重新建立连接
break;
}
else if(strcmp(tReqPack->Service_Id,ServiceID)!=0 && strcmp(tReqPack->Service_Id,MFXX)!=0)
{
Result=7; //业务代码错
Status=Result;
break;
}
else if(strncmp(tReqPack->Src_Id,ServiceCode,CPCODE_LEN)!=0)
{
Result=9; //源号码错,没有以ServiceCode开头
Status=Result;
break;
}
else if(tReqPack->DestUsr_tl != 1)
{
Result=1; //消息结构错,不支持群发包
Status=Result;
break;
}
//其他字段的检查?????????????????????????????
else if(0)
{
}
//printf("\n DN MsgLen=[%d].\n",tReqPack->Msg_Length);
tReqPack->Msg_Length = ntohl(tReqPack->Head.Total_Length) + sizeof(tReqPack->Msg_Content) - sizeof(CMPP_Submit);
//printf("\n DN MsgLen=[%d].\n",tReqPack->Msg_Length);
//形成应答包(CMPP_Connect_Resp)
CMPP_Submit_Resp * tRspPack = (CMPP_Submit_Resp *)malloc(sizeof(CMPP_Submit_Resp));
tRspPack->Head.Total_Length = htonl(sizeof(CMPP_Submit_Resp));
tRspPack->Head.Command_Id = htonl(CMPP_SUBMIT_RESP);
tRspPack->Head.Sequence_Id = tReqPack->Head.Sequence_Id;
tRspPack->Msg_Id = 0; //Msg_Id在DnReceiver中分配,所有下节点共用
tRspPack->Result = Result;
*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_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 + -