前段时间测了loadrunner直接发送报文到socket上的性能测试。在此,稍微回顾整理下。

与socket通讯,有两种方式,一种是建立长连接,建立后,不停的发送,接收。另外一种是建立短连接,建立连接,发送报文,接收响应,关闭连接。两种方式server的开销不同。Loadrunner可以把建立连接(关闭连接)是否放在VUSER_INIT(VUSER_END)中设置以上两种通讯方式。

Step1:建立连接的代码如下: int sc=0; sc = lrs_create_socket("socket1","TCP","RemoteHost=131.252.83.233:15017",LrsLastArg);

if (sc == 0)

lr_output_message("Socket was successfully created ");

else

lr_output_message("An error occurred while creating the socket, Error Code: %d", sc);

step2:建立连接成功后,就需要往socket上发送报文,发送报文的代码如下:

lrs_send("socket1", "buf2", LrsLastArg);

Q1:那么有人会问这里的buf2是在哪里配置的?这个就需要我们打开脚本中的data.ws,这部分是放置是socket通讯发送和接收报文的。上面的发送报文的语句中buf2就需要在data.ws中配置。

配置例子如下:

send buf2 275 "/x30/x32/x37/x31”

这里我们分别解释一下各字段的含义:

第一个符号“send“是代表buf2是发送报文。Data.ws中的报文有两种,一种是发送buffer,一种是接收buffer,各自对应的符号标记为”send”和”recv”

第二个符号是buffer名称,

第三个符号”275”是buffer长度,这里需要说明一下,send类型的buffer,loadrunner是根据下面配置的buffer内容来计算实际buffer长度的,因此对于send类型的buffer,这里的buffer长度只作为参考,实际上是无意义的。而recv类型的buffer,这里配置的buffer长度就必须特别注意了,loadrunner会根据配置的长度去接收socket上内容,loadrunner会尝试去读取一个符合配置长度的buffer内容。第二行是buffer内容,对于”recv”类型的buffer,loadrunner实际上是只是在log中会打印出expect receive buffer =你配置的buffer内容。

Q2:这里有人会再问,类似web(http)协议,发送的报文需要参数话,怎么做。Loadrunner里面操作也很简单,选中需要参数话的报文内容-》右键――》参数化。后期的操作与web协议一样。

Q3:这里有人会接着问,buffer里面配置的内容,以什么的编码方式,能够自行设定吗?这里我们可以再看loadrunner的配置,recording options,这里有一项配置,translation table. LoadRunner编码方式分为:ASCII码、EBCDIC码。如果选择Translation Tables中“None”方式,就是ASCII编码;其他都是选择EBCDIC编码方式,比如 00250352。其实Server是用0025方式编码,Client是用0352方式。 LoadRunenr有自己的ebcdic字典,路径是“/ebcdic”。 EBCDIC码:8位编码,可表示256个字符。EBCDIC是Extended Binary Coded Decimal Interchange Code之缩写,成为扩展式2进制10进数交换码或称扩展式BCD码。它是以左边4个区域位元(Zone bit)及右边4个数位位元合計8个位元組的资料码,一共可組合2的8次方=256种組合方式。 Note that the following functions overwrite the same internal buffer (user buffer): o lrs_ascii_to_ebcdic o lrs_ebcdic_to_ascii o lrs_get_received_buffer o lrs_get_static_buffer o lrs_decimal_to_hex_string

Step3:发送成功后,需要接收报文,一般判断测试是否通过是根据返回报文中的内容是否符合预期值来确认transaction是否通过。这里示例代码如下:

lrs_receive("socket1", "buf3", LrsLastArg);

lrs_save_param_ex("socket1", "received", "buf3", 0, 90,"ebcdic", "Response1");

lr_output_message ("消费Response: %s", lr_eval_string(""));

position=(char*) strstr(lr_eval_string(""),

lr_eval_string("0170100400"));

if(position==NULL)

lr_end_transaction("消费", LR_FAIL);

else

lr_end_transaction("消费", LR_PASS);

Q4:这里有人会问,为什么我的代码执行到lrs_receive的时候,log里面打印Waiting for writable socket 10 secs, 0 usecs,都需要等待10秒钟。是这样的,因为你在data.ws中定义了recv buffer的长度,例如你定义为100,但是socket上的返回buffer长度不是100,这时候,loadrunner会尝试再次去读取,直到读到长度为100的buffer才算成功。尝试多次,超时时间为多少?loadrunner默认为10s,所以你这里才会有等待10s的情况出现。我们可以指定超时时间:lrs_set_recv_timeout(1,10); 第一个参数是s,第二个参数是ms

当然实际情况,多数socket返回的响应buffer是变长的,这种情况下我们可以采取如下措施:

1.如果知道变长的recv buffer以什么结尾的话,可以设定loadrunner读取的时候,读到什么内容的时候停止读取。 lrs_set_receive_option(EndMarker, BinaryStringTerminator, "//x00//x07Mercury"); 具体lrs_set_receive_option还有多种用法,请参加帮助文档 2.或者我们手工指定loadrunner脚本,捕获多长的buffer。就需要使用如下代码来代替lrs_receive: lrs_receive_ex("socket1", "buf3", "NumberOfBytesToRecv=150", LrsLastArg); 到此为止,socket通讯单次的发送、接收应该基本没有什么问题了。至于多次交互涉及到的关联等技巧 ,请参考后续内容。

loadrunner socket协议问题归纳(1)的更多相关文章

  1. loadrunner socket协议问题归纳(6)

    首先让我们先看一下loadrunner- winsock 函数 一览表: lrs_accept_connection 接受侦听套接字连接 lrs_close_socket 关闭打开的套接字       ...

  2. loadrunner socket协议问题归纳(3)

    摘要:通过实例讲解loadrunner中的socket协议性能测试的一种测试方法,如何不依赖loadrunner既定规则,自行控制收发数据包 关键词:Loadrunner,socket,自行控制,收发 ...

  3. loadrunner socket协议问题归纳(0)

    一.概述         Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作.     二.socket概述         soc ...

  4. loadrunner socket协议问题归纳(2)

    编写步骤 1.建立与服务端的连接 rc=lrs_create_socket(“socket0”,”TCP”,”LocalHost=0”,”RemoteHost=127.0.0.1:8808”,LrsL ...

  5. loadrunner socket协议问题归纳(5)

    获取服务器的返回值,可以用web_reg_save_param函数,该参数最好放到: 语法: int web_reg_save_param(const char *ParamName, <lis ...

  6. loadrunner socket协议问题归纳(4)---buffer接收变长和定长的数据

    测试场景:聊天系统 用户登录后,要先向服务器发送用户名,然后可以发送聊天信息,同时也可以接受聊天信息. 如果接受的字符为定长时,可以设定接受长度.recv buf2 66 #include " ...

  7. Loadrunner socket协议lrs_receive函数接收到返回数据包 仍然等待服务器返回--解决

    前段时间在使用loadrunner socket协议发送数据包到到服务器,使用lrs_receive接收服务器应答数据包,已经接收到数据包,但LR仍然在等待服务器端返回,而且日志打印显示每次接收返回都 ...

  8. LoadRunner编写Socket协议脚本方法

    本文主要介绍使用LoadRunner手工编写Windows Socket协议测试脚本的方法. 通过LoadRunner编写Windows Socket协议测试脚本,总体说来,比较简单.就像把大象放进冰 ...

  9. Loadrunner 中socket协议RecvBuffer接收到数据长度为空

    socket通讯,有两种方式,一种是建立长连接(TCP),建立后,不停的发送,接收.另外一种是建立短连接(UDP),建立连接,发送报文,接收响应,关闭连接.两种方式 server的开销不同. 今天出现 ...

随机推荐

  1. Request和Response中文乱码问题的解决方案和区分

    首先,在刚接触这个中文乱码问题的时候,还是比较混乱的,因为针对request和response各自都有自己的解决方案,而且思路相似,方法也很相似,又针对get和post两种提交方式,分两种解决中文乱码 ...

  2. CUDA 版本,显卡驱动,Ubuntu版本,GCC版本之间的对应关系

  3. Ajax与Xml

    Ajax就是用javascript来实现的 主要是用来实现页面的局部刷新,比如当你在百度上回答别人的问题时候,没有登录,页面会弹出一个窗口,让你输入账号和密码,这就是利用ajax来做的,如果不是aja ...

  4. golang学习总结

    目录 1. 初识go语言 1.1 Hello World 1.2 go 数据类型 布尔: 整型: 浮点型: 字符类型 字符串型: 复数类型: 1.3 变量常量 局部变量: 全局变量 常量 1.5 字符 ...

  5. HIve数据存储

    表 Table 内部表 Partition 分区表 External Table 外部表 Bucket Table 桶表 内部表 分区表 parttion对应于数据库中的Partition列的密集索引 ...

  6. hadoop 提交程序并监控运行

    程序编写及打包 使用maven导入第三方jar pom.xml <?xml version="1.0" encoding="UTF-8"?> < ...

  7. upload-labs19记录

    upload-labs19记录 本次做题为白盒,因为只是fuzz的话并不能学到什么,所以从漏洞源下手. 前端校验 Pass1 源码 function checkFile() { var file = ...

  8. 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(0)

    (1)安装visual studio 2017 官网下载安装即可 (2)安装visual GDB 链接:https://pan.baidu.com/s/1TgXI1BRQLAWiWlqCcIS9TA ...

  9. android studio 调试技巧(简直太好用)

    android studio 调试技巧(简直太好用) 说到android studio的调试,很多人可能会说,这有什么可讲的不就是一个断点调试么,刚开始我也是这么认为的,直到我了解之后,才发现,调试原 ...

  10. ubuntu18.04 没声音解决方案(坑自己版)

    那啥,半个月没开电脑了,这几天打开发现系统没声了 那咋办呢,修一修呗 搜索了下问题,还挺简单的 jiang@ryzen:~$ sudo apt install pavucontrol 打开 jiang ...