前段时间测了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. Web—13-判断网站请求来自手机还是pc浏览器

    判断网站请求来自手机还是pc浏览器 #判断网站来自mobile还是pc def checkMobile(request): """ demo : @app.route(' ...

  2. [iOS]被忽略的main函数

    如同任何基于C的应用程序,程序启动的主入口点为iOS应用程序的main函数.在iOS应用程序,main函数的作用是很少的.它的主要工作是控制UIKit framework.因此,你在Xcode中创建任 ...

  3. 深入理解java虚拟机读后总结

    之前看过,很多会遗忘,标记一下,温故知新.(明天的我一定会感谢现在努力的自己. ) 一.运行时数据区域 Java虚拟机管理的内存包括几个运行时数据内存:方法区.虚拟机栈.本地方法栈.堆.程序计数器,其 ...

  4. vux使用过程中遇到的问题

    1.使用confirm.prompt组件时,ios下点击输入框很难获得焦点 解决思路:使用confirm.show方法,自定义content内容,show方法里面设置input的focus方法 let ...

  5. jdk8新特性-stream

    一.什么是流stream 1.可理解为高级版本的 Iterator 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的. 2.单向,不可往复 数据只能遍历一次,遍历过一次后即用尽了,就好比 ...

  6. 基于 HTML5 Canvas 的 Web SCADA 组态电机控制面板

    前言 HT For Web 提供完整的基于 HTML5 图形界面组件库.您可以轻松构建现代化的,跨桌面和移动终端的企业应用,无需担忧跨平台兼容性,及触屏手势交互等棘手问题.也可用于快速创建和部署,高度 ...

  7. nginx 开启phpinfo

    在nginx配置文件中加 location / { //如果是资源文件,则不走phpinfo模式 if (!-e $request_filename){ ewrite ^/(.*)$ /index.p ...

  8. Shell学习积累//持续更新

    1.until的使用 直到判断条件满足,否则会一直执行,与while使用相反 until [ $command -eq 200 ] do command=`curl -o /dev/null -s - ...

  9. ACM1021:Fibonacci Again

    Problem Description There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) ...

  10. 20155223 2016-2017-2 《Java程序设计》第10周学习总结

    20155223 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 Java Socket编程 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向 ...