【性能測試】:關於Sockets協議的腳本的開發

一,關於Sockets協議的腳本,首先對報文的解析是一個關鍵,socket

報文的解析通常對着接口文檔,弄清楚每一個字段表明什麼意思,以下一段報文,放在data.ws中編碼

"\x00\x00\x01\x5C" // 報文長度348=15c,加上本身總長度
"1"
"0"
"500001"
"0"
"AUMS"
"IBS "
"2018061217982791000000" // 發起方流水,22位
"20180612" // 發起方日期,8位
"179827" // 發起方時間,6位
"G50704"  //交易代碼 6位
"01"  //網關錯誤標識2
"       "   // 網關錯誤代碼 7
" "   //編碼1
" "   //重發標誌1
"      "   //保留位1 6
"50704"   //交易碼5
"20180612"   //交易發生日期8
"12:12:12"   //交易發生時間8
"17982790034           "   //交易流水號22
"20161110"   //交易日8
"0"   //代理標誌1
"0000"   //聯網行編號4
"8888      "   //交易網點10
"          "   //櫃員10
"    "   //出納員號4
"          "   //受權櫃員1  10
"          "   //受權櫃員2  10
"3"   //交易渠道 1
"0000      "   //終端號 10
" "   //返回碼類型 1
"T"   //請求類型 1
"00"   //受權級別 2
"1       "   //當前第幾頁 8
"10      "   //每頁記錄數 8
"                    "   //備用1  20
"                    "   //備用2  20
"                    "   //備用3  20
"                    "   //備用4  20
"6225683528000346164             "   //銀行帳號 32
"Au99.99   "   //合約代碼  10
"4011" //交易類型 4
"00015000" //委託價格 8 2
"1     " // 委託手數 6
"1" // 指令類型 1

二,是關於Sockets通訊協議,有必要了解一下長連接,短連接的區別spa

sockets報文以下代理

#include "lrs.h"


    Action()
  {
      int rc = 888;
      int RecBufLen; // 接收報文長度
      char *RecBuf = NULL; // 接收報文內容
      RecBuf = (char*)calloc(10240, sizeof(char));

      lrs_set_connect_timeout(120, 0);
      lr_start_transaction("01_50704_委託報單"); // 完整事務
      lr_start_transaction("01_50704_委託報單_創建發送通道鏈接");
      rc = lrs_create_socket("MySocket","TCP","RemoteHost=21.96.22.56:14000",LrsLastArg); // 黃金系統ip:端口
      if(rc == 0)
      {
          lr_end_transaction("01_50704_委託報單_創建發送通道鏈接", LR_PASS);
      }
      else
      {
          lr_end_transaction("01_50704_委託報單_創建發送通道鏈接", LR_FAIL);
          lr_error_message("01_50704_委託報單_創建發送通道鏈接失敗,錯誤碼是:%d", rc);
          lr_end_transaction("01_50704_委託報單", LR_FAIL);
          lrs_free_buffer(RecBuf); // 釋放空間
          lrs_disable_socket("MySocket", DISABLE_SEND_RECV); // 關閉接口
          lrs_close_socket("MySocket");
          lr_exit(LR_EXIT_ITERATION_AND_CONTINUE, LR_FAIL);
      }
      lrs_set_send_timeout(120, 0);
      lrs_set_recv_timeout(120, 0);
      lrs_set_recv_timeout2(120, 0);

      lr_start_transaction("01_50704_委託報單_發送報文");
      rc = lrs_send("MySocket", "SendBuf", LrsLastArg);
      if(rc == 0)
      {
          lr_end_transaction("01_50704_委託報單_發送報文", LR_PASS);
      }
      else
      {
          lr_end_transaction("01_50704_委託報單_發送報文", LR_FAIL);
          lr_error_message("01_50704_委託報單_發送報文失敗;錯誤碼是:%d;", rc);
          lr_end_transaction("01_50704_委託報單", LR_FAIL);
          lrs_free_buffer(RecBuf); // 釋放空間
          lrs_disable_socket("MySocket", DISABLE_SEND_RECV); // 關閉接口
          lrs_close_socket("MySocket");
          lr_exit(LR_EXIT_ITERATION_AND_CONTINUE, LR_FAIL);
      }
      // 接受報文=====================================================================
      lr_start_transaction("01_50704_委託報單_接收報文");

      rc = lrs_receive("MySocket", "ReceiveBuf", LrsLastArg);
      if((rc == 0)||(rc == 9101))
      {
          lrs_get_last_received_buffer("MySocket", &RecBuf, &RecBufLen);
          if(RecBufLen>0)
          {
              lrs_save_param_ex("MySocket", "user", RecBuf, 0, RecBufLen, "ascii", "NewRecBuf"); // 接收的完整報文
              lrs_save_param_ex("MySocket", "user", RecBuf, 112, 1, "ascii", "RetStatus"); // 接收的交易狀態
              lrs_save_param_ex("MySocket", "user", RecBuf, 85, 7, "ascii", "RetCode");  // 接收的返回碼
              lrs_save_param_ex("MySocket", "user", RecBuf, 92, 100, "ascii", "RetMsg"); // 接收的返回信息
              lrs_save_param_ex("MySocket", "user", RecBuf, 21, 22, "ascii", "RetID"); // 接收返回的流水號
              //lr_error_message("======接收的完整報文是:%s", lr_eval_string("<NewRecBuf>"));
              //lr_error_message("======發送的流水號是:%s", lr_eval_string("<DateTime><VuID><Num>"));
              //lr_error_message("======接收的流水號是:%s", lr_eval_string("<RetID>"));
              if (strcmp(lr_eval_string("<RetCode>"),"HJ0000 ") == 0)
              //if (strcmp(lr_eval_string("<RetStatus>"),"N") == 0) // N-交易成功;E-交易失敗;A-須要受權,交易未成功;W-警告(交易成功,返回提示信息);U-表示超時
              {
                  if (strcmp(lr_eval_string("<RetID>"),lr_eval_string("<DATE><TIME><VUER><UNIQ>")) == 0) // 發送流水號和接收流水號相同,防止串包
                  {
                      lr_end_transaction("01_50704_委託報單_接收報文", LR_PASS);
                      lr_end_transaction("01_50704_委託報單", LR_PASS);
                  }
                  else
                  {
                      lr_end_transaction("01_50704_委託報單_接收報文", LR_FAIL);
                      lr_end_transaction("01_50704_委託報單", LR_FAIL);
                      lr_error_message("01_50704_委託報單接收報文串包了!!!發送流水號是:%s,接收流水號是:%s,接收的完整報文是:%s", lr_eval_string("<DateTime><VuID><Num>"),lr_eval_string("<RetID>"),lr_eval_string("<NewRecBuf>"));
                  }
              }
              else
              {
                  lr_end_transaction("01_50704_委託報單_接收報文", LR_FAIL);
                  lr_end_transaction("01_50704_委託報單", LR_FAIL);
                  lr_error_message("01_50704_委託報單接收報文出錯!交易狀態是:%s,返回碼是:%s,返回信息是:%s,接收的完整報文是:%s", lr_eval_string("<RetStatus>"),lr_eval_string("<RetCode>"),lr_eval_string("<RetMsg>"),lr_eval_string("<NewRecBuf>"));
              }
          }
          else
          {
              lr_end_transaction("01_50704_委託報單_接收報文", LR_FAIL);
              lr_end_transaction("01_50704_委託報單", LR_FAIL);
              lr_error_message("01_50704_委託報單接收報文爲空!發送流水號是:%s", lr_eval_string("<DateTime><VuID><Num>"));
          }
      }
      else
      {
          lr_end_transaction("01_50704_委託報單_接收報文", LR_FAIL);
          lr_error_message("01_50704_委託報單_接收報文失敗;錯誤碼是:%d;", rc);
          lr_end_transaction("01_50704_委託報單", LR_FAIL);
      }
      lrs_free_buffer(RecBuf); // 釋放空間

      lrs_disable_socket("MySocket", DISABLE_SEND_RECV);  // 關閉接口
      lrs_close_socket("MySocket");

      return 0;
  }
相關文章
相關標籤/搜索