Loadrunner 中socket协议RecvBuffer接收到数据长度为空
socket通讯,有两种方式,一种是建立长连接(TCP),建立后,不停的发送,接收。另外一种是建立短连接(UDP),建立连接,发送报文,接收响应,关闭连接。两种方式 server的开销不同。
今天出现问题:不管是创建TCP还是UDP连接,发送数据后,接收到数据的长度均为空值。
我的代码如下:

wireshark抓包查看到的结果(有接收到服务发送过来的数据):

运行时查看Loadrunner中打印日志:

多次修改代码后,最后修改接收的buffer 的长度,终于接收到数据
总结:之前看过一篇文章,如果接收到的数据长度不固定,可以指定buffer的数据长度为“*”。 现在才明白,原来 “*” 表示不接收数据 。花费一天的时间,终于搞定。
对于recvbuffer数据长度不一致的问题,或许可以参考http://blog.sina.com.cn/s/blog_6bdd0e1d0101b13r.html 这篇文章。copy 内容如下:
使用LoadRunner录制socket协议的脚本,会发现每个请求都会发送和接受一定长度的数据流,即send buffer和recv buffer;这两个buffer后面都会有个数字,这个数字表示buffer的长度,是一个固定的值。当做性能测试时,执行每次请求响应的数据很多时候是不定长的,如果recv buffer的长度与响应的数据长度不一致,脚本会报错,有两种方法可以解决这个问题:
1、造数据,使响应的数据长度在每次不同请求中都一样。但实际上,方法1是有局限性的,也就是说有些请求通过造数据也不能使响应的数据长度一致,那么我们可以采用方法2。
2、自定义函数,动态解析并接受不定长响应数据流。
以下详细介绍下方法2,以举例讲解的方式来介绍:
【业务场景】:用户进行登录操作,每次登录的响应数据由于被加密压缩后才返回的缘故,导致长度不一致。
【协议简介】:用户登录操作采取的协议是自定义协议,协议头中第5,6个byte保存的是整个响应流的长度。
【自定义函数的思路】:先接受响应数据中的前6个bytes,然后取5,6位上的字节转换成int类型,得到整个响应流的长度,从而计算出剩下未被接受的数据长度,再接受剩下的数据。
【代码实现】:
第一部分,录制后未经修改的脚本如下:
Action()
{
lr_start_transaction("login");
lrs_create_socket("socket6","TCP","RemoteHost=172.16.4.16:1122", LrsLastArg);
//登录请求
lrs_send("socket6", "buf1",LrsLastArg);
lrs_receive("socket6","buf2",LrsLastArg);
lrs_close_socket("socket6");
lr_end_transaction("login",LR_AUTO);
return 0;
}
send buf1 49
"\x00\x00"
recv buf2 291 //每次请求的响应数据长度不一定是291个字节
#include "lrs.h"
int custom_lrs_receive(char *sock_desc, char *buf_desc,void *dummy)
{
int rc;
int buf_len = 6;
char szBytesLength[30], *buf = NULL, *pszError, *pszLastChar;
rc = lrs_receive_ex(sock_desc, buf_desc, "NumberOfBytesToRecv=6", LrsLastArg);
if (rc != 0) //正常情况下函数返回为0,非0表示函数有错误
{
lr_error_message("Receive 6 bytes failed. The error code = %d", rc);
return -1;
}
//判断前6个字节是否接受成功
lrs_get_last_received_buffer(sock_desc, &buf, &buf_len);
if (buf == NULL || buf_len != 6)
{
lr_error_message("receive of %s failed", buf_desc);
return -1;
}
sprintf (szBytesLength, "NumberOfBytesToRecv=%d", fiFromHexBinToInt(buf) - 6);
//调用另一个自定义函数:计算总长度的函数
lr_debug_message(LR_MSG_CLASS_FULL_TRACE, "!!!! Bytes length = %s", szBytesLength);
rc = lrs_receive_ex(sock_desc, buf_desc, szBytesLength, LrsLastArg);
if (rc != 0)
return -1;
return 0;
}
int fiFromHexBinToInt(char *szBuffer)
{
int i, j, iIntValue = 0, iExp = 1;
//一个字节一个字节的取值,循环2次,分别取第6位,第5位上的字节
for( i = 1; i >= 0; i--)
{
iExp = 1;
//从16进制字节流转换成int类型:2个byte4个bit,每个字节的低位分别需要乘以16的0次方和16的2次方;
for (j = 2; j > i*2; j--)
iExp *= 16;
iIntValue += (szBuffer[i+4] & 0x0000000f) * iExp + ((szBuffer[i+4] & 0x000000f0) >> 4) * iExp * 16;
}
lr_output_message("the length is %d", iIntValue);
return iIntValue;
}
Action()
{
lr_start_transaction("login");
lrs_create_socket("socket6", "TCP", "RemoteHost=172.16.4.16:1122", LrsLastArg);
// 登录请求
lr_think_time(5);
lrs_send("socket6", "buf1", LrsLastArg);
custom_lrs_receive("socket6", "buf2", LrsLastArg); //自定义函数接受不定长数据流
Loadrunner 中socket协议RecvBuffer接收到数据长度为空的更多相关文章
- Loadrunner中socket协议中的三个关联函数
这3个函数其实都可以动态获取运行中收到的数据包中的数据,只要跟在要获取的收取数据包脚本后面即可.其中:lrs_save_searched_string和lrs_save_param如果buf_desc ...
- 自行控制loadrunner的socket协议性能测试 (转)
一前言 二任务的提出 三实现方案讨论 四技术要点讲解 如何开始录制一个最简单的收发数据包脚本 写日志文件 一行一行读数据包文件 字符串转换为十六进制数据包 发送自己定义的数据包 接收数据包到自定义缓冲 ...
- LoadRunner中winsocket协议学习
首先让我们先看一下loadrunner- winsock 函数 一览表: lrs_accept_connection 接受侦听套接字连接 lrs_close_socket 关闭打开的套接 ...
- LoadRunner编写Socket协议脚本方法
本文主要介绍使用LoadRunner手工编写Windows Socket协议测试脚本的方法. 通过LoadRunner编写Windows Socket协议测试脚本,总体说来,比较简单.就像把大象放进冰 ...
- loadrunner使用socket协议来实现客户端对服务器产生压力实例。(通过发送心跳包,达到连接多个客户端的目的)
#include "lrs.h" vuser_init(){ char *ip; int handler; //编写获取LR分配的Vuser IP函数,将IP保存在ip变量中. i ...
- AJAX中使用post,get接收发送数据的区别
如何发起请求 xhr.send(); 备注: 如果是get方式,send()命令中不用写任何参数 传递的数据可以写在url中,服务器用$_GEET["参数名"]接收 如果是post ...
- loadrunner socket协议问题归纳(3)
摘要:通过实例讲解loadrunner中的socket协议性能测试的一种测试方法,如何不依赖loadrunner既定规则,自行控制收发数据包 关键词:Loadrunner,socket,自行控制,收发 ...
- loadrunner socket协议问题归纳(0)
一.概述 Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作. 二.socket概述 soc ...
- 品味性能之道<九>:利用Loadrunner编写socket性能测试脚本简述
一.概述 Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作. 二.socket概述 ...
随机推荐
- Linux 新建文件/文件夹,删除文件文件夹,查找文件 打开文件
1.新建文件夹:mkdir xx 2.新建文件: touch 1.py 3.删除文件/文件夹: rm -r xx rm 1.py 4.打开文件:cat 1.py 只显示前几行 :head -2 1. ...
- day3--深入学习命令总结
1.查看命令帮助的几种方法 a.[命令] --help 适用于一般命令,非内置命令 b.man [命令] 适用于一般命令,非内置命令 c.help [命令] 适用于内置命令 d ...
- 学习笔记-----php搭建用户管理系统
后台:php,数据库:mysql,前端:html,css,js; 主要页面介绍: 1.php连接数据库后台,读取数据并将其以表格的形式显示,并且有添加,编辑,删除,分页等功能: 2.php用于添加用户 ...
- 在微信端使用video标签,播放结束会出现QQ浏览器推荐视频的解决办法(vue)
会出现播放结束显示QQ浏览器推荐视频的原因:(我是vue的项目,而且我是新手,只是单纯的给大家分享一个方法,代码比较low请自动忽略) 因为在x5(QQ浏览器)内核中,把video标签劫持了,只要是检 ...
- PLSQL锁表之后改如何操作
(1)查看哪个表被锁select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects ...
- windows中更换Jdk版本不生效
本机已经安装了jdk1.7,而比较早期的项目需要依赖jdk1.6,于是同时在本机安装了jdk1.6和jdk1.7. 安装jdk1.6前,执行java -version得到 C:\Users\liuxi ...
- c++/cmake /Android NDK 动态链接库交叉编译笔记
项目使用cmake管理,由于项目的需要,核心代码要求跨 Linux/Windows/Android 三平台.Windows和Linux都好说,但Android NDK费了一番功夫还是没有解决.临时的解 ...
- 《Metasploit魔鬼训练营》第七章学习笔记
P314 木马程序的制作 msfpayload和msfencoder已被msfvenom取代.使用msfvenom -h查看具体用法.以下网址也有相关教程: https://github.com/ra ...
- AbpZero双重认证之短信的坑
一.什么是双重认证 所谓双重认证简单来说就是除了用户名密码方式外,还额外增加了一道登录屏障.登录时先输入用户名和密码,正确后会向邮箱或手机号发送一个验证码(取决于您采用何种方式,甚至可以采用银行的电子 ...
- Mysql基础--表的操作
1.表的基本概念 每一行代表一条唯一的记录,每一列代表记录中的一个字段. 2.创建表 例子: 3.查看表结构 (1)DESCRIBE语句查看表定义 语法: 例子: (2)SHOW CREATE TAB ...