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

📄 main.pas

📁 操作数据库的例子
💻 PAS
📖 第 1 页 / 共 5 页
字号:
          SendMt(MtSeqId);
        end;
      end;
    end
    else
    begin
      if now - LastLoginTime > 6 / 3600 / 24 then
      begin
        SendPacket(CreatePacket(SMGP13_LOGIN));
        LastLoginTime := now;
      end;
    end;
  end;
end;
// 对外发送函数
procedure TOutReadSMGPThreadObj.SendMt(i: integer);
var
  Buffer: TMtBuffer;
  outpac: TSMGP13_PACKET;
begin
  Buffer := mtbuffer.Read(i);
  outpac := CreatePacket(SMGP13_SUBMIT);
  outpac.MsgHead.SequenceID := i;
  outpac.MsgBody.SUBMIT.MsgType := Buffer.OutMsgType;
  Move(Buffer.OutServiceID, outpac.MsgBody.SUBMIT.ServiceID, sizeof(Buffer.OutServiceID));
  Move(Buffer.OutFeeType, outpac.MsgBody.SUBMIT.FeeType, sizeof(Buffer.OutFeeType));
  Move(Buffer.OutFixedFee, outpac.MsgBody.SUBMIT.FixedFee, sizeof(Buffer.OutFixedFee));
  Move(Buffer.OutFeeCode, outpac.MsgBody.SUBMIT.FeeCode, sizeof(Buffer.OutFeeCode));
  outpac.MsgBody.SUBMIT.MsgFormat := Buffer.Mt.MtMsgFmt;
  Move(Buffer.Mt.MtValidTime, outpac.MsgBody.SUBMIT.ValidTime, sizeof(Buffer.Mt.MtValidTime));
  Move(Buffer.Mt.MtAtTime, outpac.MsgBody.SUBMIT.AtTime, sizeof(Buffer.Mt.MtAtTime));
  Move(Buffer.Mt.MtSpAddr, outpac.MsgBody.SUBMIT.SrcTermID, sizeof(TSMGP13PhoneNum));
  Move(Buffer.Mt.MtFeeAddr, outpac.MsgBody.SUBMIT.ChargeTermID, sizeof(TSMGP13PhoneNum));
  Move(Buffer.Mt.MtUserAddr, outpac.MsgBody.SUBMIT.DestTermID, sizeof(TSMGP13PhoneNum));
  outpac.MsgBody.SUBMIT.MsgLength := Buffer.Mt.MtMsgLenth;
  Move(Buffer.Mt.MtMsgContent, outpac.MsgBody.SUBMIT.MsgContent, Buffer.Mt.MtMsgLenth);
  outpac.MsgHead.PacketLength := sizeof(TSMGP13_HEAD) + sizeof(TSMGP13_SUBMIT) - sizeof(outpac.MsgBody.SUBMIT.MsgContent) + Buffer.Mt.MtMsgLenth;
  SendPacket(outpac);
end;

procedure TOutReadSMGPThreadObj.SendPacket(pac: TSMGP13_PACKET);
var
  sendbuffer: TCOMMBuffer;
  NetPacOut, LocPacOut: TSMGP13_PACKET;
begin
  //初始化变量
  ZeroMemory(@sendbuffer, sizeof(TCOMMBuffer));
  sendbuffer.BufferSize := 0;
  NetPacOut := pac;
  LocPacOut := pac;

  //包头部分,进行网络字节序转换
  //htonl(将32位主机字符顺序转换成网络字符顺序).
  NetPacOut.MsgHead.PacketLength := htonl(LocPacOut.MsgHead.PacketLength);
  NetPacOut.MsgHead.RequestID := htonl(LocPacOut.MsgHead.RequestID);
  NetPacOut.MsgHead.SequenceID := htonl(LocPacOut.MsgHead.SequenceID);

  //将包头复制到发送缓冲中
  //move函数的作用是将输入数组中的元素从后面开始,两两交换,循环次数用n控制
  Move(NetPacOut.MsgHead, sendbuffer.Buffer, sizeof(TSMGP13_HEAD));
  sendbuffer.BufferSize := sizeof(TSMGP13_HEAD);

  case pac.MsgHead.RequestID of
    SMGP13_LOGIN:
      begin
        NetPacOut.MsgBody.LOGIN.TimeStamp := htonl(LocPacOut.MsgBody.LOGIN.TimeStamp);
        Move(NetPacOut.MsgBody.LOGIN, sendbuffer.Buffer[sendbuffer.BufferSize], sizeof(TSMGP13_LOGIN));
        sendbuffer.BufferSize := sendbuffer.BufferSize + sizeof(TSMGP13_LOGIN);
      end;

    SMGP13_SUBMIT:
      begin
        Move(NetPacOut.MsgBody.SUBMIT, sendbuffer.Buffer[sendbuffer.BufferSize], 127);
        sendbuffer.BufferSize := sendbuffer.BufferSize + 127;
        Move(NetPacOut.MsgBody.SUBMIT.MsgContent, sendbuffer.Buffer[sendbuffer.BufferSize], NetPacOut.MsgBody.SUBMIT.MsgLength);
        sendbuffer.BufferSize := sendbuffer.BufferSize + NetPacOut.MsgBody.SUBMIT.MsgLength;
        Move(NetPacOut.MsgBody.SUBMIT.Reserve, sendbuffer.Buffer[sendbuffer.BufferSize], sizeof(NetPacOut.MsgBody.SUBMIT.Reserve));
        sendbuffer.BufferSize := sendbuffer.BufferSize + sizeof(NetPacOut.MsgBody.SUBMIT.Reserve);
      end;

    SMGP13_DELIVER_RESP:
      begin
        NetPacOut.MsgBody.DELIVER_RESP.Status := htonl(LocPacOut.MsgBody.DELIVER_RESP.Status);
        Move(NetPacOut.MsgBody.DELIVER_RESP, sendbuffer.Buffer[sendbuffer.BufferSize], sizeof(TSMGP13_DELIVER_RESP));
        sendbuffer.BufferSize := sendbuffer.BufferSize + sizeof(TSMGP13_DELIVER_RESP);
      end;

    SMGP13_ACTIVE_TEST:
      begin

      end;

    SMGP13_ACTIVE_TEST_RESP:
      begin

      end;
  end;

  if sendbuffer.BufferSize = LocPacOut.MsgHead.PacketLength then
  begin
    if LocPacOut.MsgHead.RequestID = SMGP13_SUBMIT then
    begin
      inc(WindowSize);
      mtbuffer.Update(LocPacOut.MsgHead.SequenceID);
      inc(FMtCount);
    end;

    if MainForm.OutMonitor.Checked then
    begin
      MonitorThread.OutMonitorBuffer.Add(LocPacOut);
    end;

    try
      FTCPClient.WriteBuffer(sendbuffer.Buffer, sendbuffer.BufferSize);
    except
      on e: exception do
      begin
        AddMsgToMemo('SMGP外部网关发送线程' + e.Message);
        FTCPClient.Disconnect;
      end;
    end;
  end;
end;

procedure TOutReadSMGPThreadObj.ThAddMsgToMemo;
begin
  if MainForm <> nil then
  begin
    MainForm.ShowToMemo(ErrMsg, MainForm.MonitorMemo);
  end;
end;
//SMGP
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


//CMPP
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
{CMPP0 移动 7890  TMtSendCMPPThreadObj}
procedure TMtSendCMPPThreadObj.AddMsgToMemo(const Msg: string);
begin
  ErrMsg := Msg;
  Synchronize(ThAddMsgToMemo);
end;

constructor TMtSendCMPPThreadObj.Create(CreateSuspended: boolean);
begin
  inherited;
  LastActiveTime := now;
end;

destructor TMtSendCMPPThreadObj.destroy;
begin
  LastActiveTime := 0;
  inherited;
end;

procedure TMtSendCMPPThreadObj.Execute;
begin
  FreeOnTerminate := True;
  while not Terminated do
  begin
    try
      try
        MtPrc;
      except
        on e: exception do
        begin
          AddMsgToMemo('MTCMPP消息发送线程:' + e.Message);
        end;
      end;
    finally
      LastActiveTime := now;
      //这里需要做流量限制
      sleep(1000 div GGATECONFIG.Flux);
    end;
  end;
end;

procedure TMtSendCMPPThreadObj.MtPrc;
begin
  if OutReadCMPPThread <> nil then
  begin
    OutReadCMPPThread.PrcMt;
  end;
end;

procedure TMtSendCMPPThreadObj.ThAddMsgToMemo;
begin
  if MainForm <> nil then
  begin
    MainForm.ShowToMemo(ErrMsg, MainForm.MonitorMemo);
  end;
end;

{CMPP0 移动 7890  TOutReadCMPPThreadObj}
procedure TOutReadCMPPThreadObj.AddMsgToMemo(const Msg: string);
begin
  ErrMsg := Msg;
  Synchronize(ThAddMsgToMemo);
end;

procedure TOutReadCMPPThreadObj.ClientRead;
begin
  //CMPP 读取到CMPP缓冲
  try
    try
      FTCPCmppClient.CheckForGracefulDisconnect();
    except
      on e: exception do
      begin
        AddMsgToMemo('TOutReadCmppThreadObj' + e.Message);
        sleep(1000);
      end;
    end;

    if FTCPCmppClient.Connected then
    begin
      if FRecCmppBuffer.BufferSize = 0 then
      begin
        //初始化结构体,用来分别存放网络数据包和本地数据包
        ZeroMemory(@FlocCmppPacketIn, sizeof(TCMPP20_PACKET));
        ZeroMemory(@FnetCmppPacketIn, sizeof(TCMPP20_PACKET));
        //这里阻塞读取数据包头
        FTCPCmppClient.ReadBuffer(FRecCmppBuffer.Buffer, sizeof(TCMPP_HEAD));
        FRecCmppBuffer.BufferSize := sizeof(TCMPP_HEAD);
        //将读到的包头数据复制到网络结构体中
        Move(FRecCmppBuffer.Buffer, FnetCmppPacketIn.MsgHead, sizeof(TCMPP_HEAD));
        //经网络字节序转换后,将网络结构体包头复制到本地结构体中
        FlocCmppPacketIn.MsgHead.Total_Length := ntohl(FnetCmppPacketIn.MsgHead.Total_Length);
        FlocCmppPacketIn.MsgHead.Command_ID := ntohl(FnetCmppPacketIn.MsgHead.Command_ID);
        FlocCmppPacketIn.MsgHead.Sequence_ID := ntohl(FnetCmppPacketIn.MsgHead.Sequence_ID);
      end;

      case FlocCmppPacketIn.MsgHead.Command_ID of
        CMPP_CONNECT_RESP:
          begin
            //登录应答包,读取对应的长度,并复制到网络结构体和本地结构体中
            FTCPCmppClient.ReadBuffer(FRecCmppBuffer.Buffer[FRecCmppBuffer.BufferSize], sizeof(TCMPP_CONNECT_RESP));
            FRecCmppBuffer.BufferSize := FRecCmppBuffer.BufferSize + sizeof(TCMPP_CONNECT_RESP);
            Move(FRecCmppBuffer.Buffer, FnetCmppPacketIn, FRecCmppBuffer.BufferSize);
            FlocCmppPacketIn.MsgBody.CMPP_CONNECT_RESP := FnetCmppPacketIn.MsgBody.CMPP_CONNECT_RESP;
            FlocCmppPacketIn.MsgBody.CMPP_CONNECT_RESP.Status := ntohl(FnetCmppPacketIn.MsgBody.CMPP_CONNECT_RESP.Status);
          end;

        CMPP_SUBMIT_RESP:
          begin
            //下行应答包,读取对应的长度,并复制到网络结构体和本地结构体中
            FTCPCmppClient.ReadBuffer(FRecCmppBuffer.Buffer[FRecCmppBuffer.BufferSize], sizeof(TCMPP_SUBMIT_RESP));
            FRecCmppBuffer.BufferSize := FRecCmppBuffer.BufferSize + sizeof(TCMPP_SUBMIT_RESP);
            Move(FRecCmppBuffer.Buffer, FnetCmppPacketIn, FRecCmppBuffer.BufferSize);
            FlocCmppPacketIn.MsgBody.CMPP_SUBMIT_RESP := FnetCmppPacketIn.MsgBody.CMPP_SUBMIT_RESP;
            FlocCmppPacketIn.MsgBody.CMPP_SUBMIT_RESP.result := ntohl(FnetCmppPacketIn.MsgBody.CMPP_SUBMIT_RESP.result);
          end;

        CMPP_DELIVER:
          begin
            FTCPCmppClient.ReadBuffer(FRecCmppBuffer.Buffer[FRecCmppBuffer.BufferSize], FlocCmppPacketIn.MsgHead.Total_Length - FRecCmppBuffer.BufferSize);
            FRecCmppBuffer.BufferSize := FlocCmppPacketIn.MsgHead.Total_Length;
            Move(FRecCmppBuffer.Buffer, FnetCmppPacketIn, FRecCmppBuffer.BufferSize);
            FnetCmppPacketIn.MsgBody.CMPP_DELIVER.MSG_LENGTH := FlocCmppPacketIn.MsgHead.Total_Length - sizeof(TCMPP_HEAD) - 77;
            FlocCmppPacketIn.MsgBody.CMPP_DELIVER := FnetCmppPacketIn.MsgBody.CMPP_DELIVER;
            ZeroMemory(@FlocCmppPacketIn.MsgBody.CMPP_DELIVER.Msg_Content, sizeof(FlocCmppPacketIn.MsgBody.CMPP_DELIVER.Msg_Content));
            ZeroMemory(@FlocCmppPacketIn.MsgBody.CMPP_DELIVER.Reserved, sizeof(FlocCmppPacketIn.MsgBody.CMPP_DELIVER.Reserved));
            Move(FnetCmppPacketIn.MsgBody.CMPP_DELIVER.Msg_Content, FlocCmppPacketIn.MsgBody.CMPP_DELIVER.Msg_Content, FlocCmppPacketIn.MsgBody.CMPP_DELIVER.MSG_LENGTH);
            Move(FnetCmppPacketIn.MsgBody.CMPP_DELIVER.Msg_Content[FlocCmppPacketIn.MsgBody.CMPP_DELIVER.MSG_LENGTH], FlocCmppPacketIn.MsgBody.CMPP_DELIVER.Reserved, sizeof(FlocCmppPacketIn.MsgBody.CMPP_DELIVER.Reserved));
            FnetCmppPacketIn.MsgBody := FlocCmppPacketIn.MsgBody;
          end;

        CMPP_ACTIVE_TEST:
          begin
            //AddMsgToMemo('CMPP外部网关活动测试要求');
          end;

        CMPP_ACTIVE_TEST_RESP:
          begin
            //AddMsgToMemo('CMPP外部网关活动测试回复');
          end;
        CMPP_TERMINATE:
          begin
            AddMsgToMemo('CMPP外部网关要求终止连接');
          end;
        CMPP_TERMINATE_RESP:
          begin
            AddMsgToMemo('CMPP外部网关要求终止连接应答');
          end;

      else
        begin
          FTCPCmppClient.Disconnect;
        end;
      end;

      if MainForm.OutMonitor.Checked then
      begin
        //暂时取消监控 2005/11/12
        MonitorThread.OutMonitorcmppBuffer.Add(FlocCmppPacketIn);
      end;

      case FlocCmppPacketIn.MsgHead.Command_ID of
        CMPP_CONNECT_RESP:
          begin
            if (FlocCmppPacketIn.MsgBody.CMPP_CONNECT_RESP.Status = 0) and (FlocCmppPacketIn.MsgBody.CMPP_CONNECT_RESP.Version <> 0) then
            begin
              FLogined := True;
              AddMsgToMemo('CMPP外部网关端口登录成功');
            end
            else
            begin
              FLogined := false;
              AddMsgToMemo('CMPP外部网关登录失败');
            end;
          end;

        CMPP_SUBMIT_RESP:
          begin
            if FlocCmppPacketIn.MsgBody.CMPP_SUBMIT_RESP.Msg_Id = 0 then
            begin
              AddMsgToMemo('NO');
            end else
            begin
              AddMsgToMemo('YES');
            end;
            mtcmppbuffer.UpdateResp(FlocCmppPacketIn.MsgHead.Command_ID, FlocCmppPacketIn.MsgBody.CMPP_SUBMIT_RESP.Msg_Id, FlocCmppPacketIn.MsgBody.CMPP_SUBMIT_RESP.result);
            inc(FMtRespCount);
            WindowSize := WindowSize - 1;
            if WindowSize < 0 then WindowSize := 0;
          end;

        CMPP_DELIVER: //mo上行过来的写入缓冲
          begin
            //写入缓冲,或是状态报告
            if FlocCmppPacketIn.MsgBody.CMPP_DELIVER.Registered_Delivery = 1 then
            begin
              //状态报告,写入状态报告缓冲中
              rptcmppbuffer.Add(FlocCmppPacketIn);
              inc(FRptCount);
            end
            else
            begin
              //MO,将Mo写入Mo缓冲中
              mocmppbuffer.Add(FlocCmppPacketIn);
              inc(FMoCount);
            end;

            //应答
            SendPacket(CreateRespPacket(FlocCmppPacketIn));
          end;

        CMPP_ACTIVE_TEST:
          begin
            WindowSize := 0;
            SendPacket(CreateRespPacket(FlocCmppPacketIn));
            LastSendActiveTime := now();
          end;

        CMPP_ACTIVE_TEST_RESP:
          begin
            WindowSize := 0;
            LastSendActiveTime := now();
          end;
      end;

      FRecCmppBuffer.BufferSize := 0;
      ZeroMemory(@FRecCmppBuffer.Buffer, sizeof(FRecCmppBuffer.Buffer));
    end;
  except
    on e: exception do
    begin
      AddMsgToMemo('CMPP外部网关接收线程:' + e.Message);
      sleep(1000);
      FTCPCmppClient.Disconnect;
    end;
  end;

end;

constructor TOutReadCMPPThreadObj.Create(CreateSuspended: boolean);
begin
  inherited;
  ZeroMemory(@FRecCmppBuffer.Buffer, sizeof(FRecCmppBuffer.Buffer));
  FRecCmppBuffer.BufferSize := 0;
  ZeroMemory(@FlocCmppPacketIn, sizeof(TCMPP20_PACKET));
  ZeroMemory(@FnetCmppPacketIn, sizeof(TCMPP20_PACKET));
  FLogined := false;
  FMoCount := 0;
  FMtCount := 0;
  FRptCount := 0;
  FMtRespCount := 0;
  FMtRefuseCount := 0;
  Seqid := 1;
  WindowSize := 0;
  FLastActiveTime := now;
  MtHasUnsendMessage := false;
  MtMessage := '';
  MtNumber := '';
  MtUnsend := 100;
  log_port := 0;
end;

function TOutReadCMPPThreadObj.CreatePacket(
  const RequestID: Cardinal): TCMPP20_PACKET;
var
  pac: TCMPP20_PACKET;
  Time: string;
  strTemp: string;
  tempArray: array[0..255] of char

⌨️ 快捷键说明

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