loadrunner socket 测试

本文详细介绍了使用特定库处理8583报文的完整流程,包括初始化交易、发送请求、接收报文并解析返回码,最终判断交易状态并结束交易。重点在于自定义接收函数实现8583报文的不定长接收,并通过比较返回码来确认交易成功与否。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ACITON:

#include "lrs.h"


//定义全局变量:retmsg返回的报文,接收报文长度

char g_retmsg[4048];
int  g_retlen=0;

//报文头的长度:使用的8583的报文,12个字节的报文头部信息,最后的4个字节的字符表示后续报文的长度
int  g_headlen=12;
//报文长度的偏移量,和表示长度的字节数
int  g_offset=8;
int  g_msglen=4;





Action()
{

      char sResponse[3];//8583的返回码
      int  iRes_off=g_headlen+2;//8385 39域所在偏移量

      int iRet=-1;//自定义接收报文函数返回值
     


      //清空接收报文的BUFF  全局变量
      memset(g_retmsg,0x00,sizeof(g_retmsg));
    memset(sResponse,0x00,sizeof(sResponse));


    lr_start_transaction("HF_QUERY");//定义交易名称
      lrs_set_recv_timeout(30,0);//建立连接前的超时时间
      lrs_set_recv_timeout2(60,0);//接收超时时间


      //创建SOCKET 通讯连接
      lrs_create_socket("socket0", "TCP", "RemoteHost=127.0.0.1:60000",LrsLastArg);
      //发送报文
      lrs_send("socket0", "buf0", LrsLastArg);

      iRet=custom_lrs_receive("socket0", "buf1", LrsLastArg);

      if(iRet!=0)
      {
            lr_message("交易失败,接收报文失败!");
            lrs_close_socket("socket0");
            lr_end_transaction("HF_QUERY", LR_FAIL);
      }
      else
      {
            lr_message("接收报文成功!");
           
      }

      memcpy(sResponse,g_retmsg+iRes_off,2);

      lr_output_message("------sResponse = [%s]-------",sResponse);

      if(memcmp(sResponse,"00",2)==0)//交易成功
      {
            lrs_close_socket("socket0");
            lr_end_transaction("HF_QUERY", LR_PASS);
      }
      else{

            lrs_close_socket("socket0");
            lr_message("交易失败返回码失败");
            lr_end_transaction("HF_QUERY", LR_FAIL);

      }




      return 0;
}







//自定义通讯函数,用于接收8583的不定长的报文格式
//接收到的包文件放入到 全局变量 g_retmsg,和g_retlen中
//参数说明 :sock_desc (socket句柄) ,buf_desc (data中的接收buf名称) ,dummy 这个参数没有什么用

int custom_lrs_receive(char *sock_desc, char *buf_desc,void *dummy)
{

      int rc;
      int buf_len = g_headlen;//报文头的长度
      char szBytesLength[30];


      char *buf = NULL, *pszError, *pszLastChar;

      char sMsgLen[20];

      memset(sMsgLen,0x00,sizeof(sMsgLen));
      memset(szBytesLength,0x00,sizeof(szBytesLength));

      //首先接收报文头的长度:g_headlen=12
      //rc = lrs_receive_ex(sock_desc, buf_desc, "NumberOfBytesToRecv=12", LrsLastArg);


      lr_output_message("----------- RECICVER start -----------");
      sprintf(szBytesLength,"NumberOfBytesToRecv=%d",g_headlen);
      rc = lrs_receive_ex(sock_desc, buf_desc,szBytesLength,LrsLastArg);


      if (rc!= 0)        //正常情况下函数返回为0,非0表示函数有错误
      {
              lr_error_message("ERROR: 接收报文头错误    Error_code= %d", rc);
              return -1;

      }


      //判断前6个字节是否接受成功
      lrs_get_last_received_buffer(sock_desc, &buf, &buf_len);

      if (buf == NULL || buf_len != g_headlen)
      {
              lr_error_message("ERROR:接收报文头错误,长度不符,或者buff未接收  BUFF=[%s]", buf_desc);
              return -1;
      }

      //复制报文头到全局BUFF中

      memcpy(g_retmsg,buf,g_headlen);
      memcpy(sMsgLen,buf+g_offset,g_msglen);

     
      memset(szBytesLength,0x00,sizeof(szBytesLength));
      sprintf (szBytesLength, "NumberOfBytesToRecv=%s",sMsgLen);//最后4个字节就就是后面报文的长度


    // 打出日志
    lr_output_message("sMsgLen=[%s],    NumberOfBytesToRecv==[%s]",sMsgLen,szBytesLength);


      //接收后面的报文体
      rc = lrs_receive_ex(sock_desc, buf_desc, szBytesLength, LrsLastArg);

      if (rc != 0)//
      {
              lr_error_message("ERROR: 接收后续报文体错误    Error_code= %d", rc);
              return -1;
      }
      lrs_get_last_received_buffer(sock_desc, &buf, &buf_len);


      lr_output_message("报文体接收字节数=[%d]",buf_len);

      if (buf==NULL)
      {
              lr_error_message("接收报文体出错,BUFF为空[%s]", buf_desc);
              return -1;
      }


      //将报文体的内容复制到全局变量中
      memcpy(g_retmsg+g_headlen,buf,atoi(sMsgLen));
      g_retlen=atoi(sMsgLen)+g_headlen;

      lr_output_message("----------- RECICVER OK END-----------");
      return 0;

}


data.ws

loadruner <wbr>测试

模拟服务器:

loadruner <wbr>测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值