转自:http://blog.csdn.net/zeeslo/article/details/1661791

今天写一下winsock的关联操作。
以前看过一个文档。在英文版的讲winsock的,其中讲到关联。大致操作是:
1,录制。
2,回放。这里是失败。
3,到data.ws里找需要关联的数据。
4,按F7,打开EBCDIC translation对话框。
5,查找数据的位置及偏移量。
6,到脚本中写函数用:lrs_save_param, lrs_save_param_ex, lrs_save_searched_string,这三个函数。
 
Notes:winsock的关联函数要写到需要关联的代码行的下面。
 
说明一下这几个函数:
Lrs_save_param:
int lrs_save_param ( char *s_desc,char *buf_desc, char *param_name, int offset, int param_len);
这个函数保存buffer中的数据到一个参数里。这个函数是用来在脚本中做关联的。
前两个参数是为了指定特定的参数。
在指定活动的socket和buffer之后,需要指定一个参数来保存数据。指定偏移量来显示buffer中数据的偏移量和数据的长度。
保存了参数之后,可以在脚本和数据文件使用它,代替所有需要替代的值。替换时要用选项中的定义的符号来引用。
注意:要从buffer中保存一个编码过的数据到参数中,要用lrs_save_param_ex函数。
lrs_save_param_ex
int lrs_save_param_ex ( char *s_desc, char *type, char *buff, int offset, int length, char *encoding, char *param );
 
 
下面说不用这么麻烦的操作的,直接点几下就可以了。
 
1         录制脚本
这个没什么说的吧。选择协议winsock,这要是也不懂,我建议你去看十遍手册。
我这里录制到的脚本如下:
       lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=192.168.1.114:5560", LrsLastArg);
       lrs_send("socket0", "buf0", LrsLastArg);
       lrs_receive("socket0", "buf1", LrsLastArg);
       lrs_create_socket("socket1", "TCP", "LocalHost=0", "RemoteHost=192.168.1.114:5560", LrsLastArg);
       lrs_send("socket1", "buf2", LrsLastArg);
       lrs_receive("socket1", "buf3", LrsLastArg);
相应的data.ws如下:
;WSRData 2 1
 
send buf0 50
       "OPERTYPE(LOGIN)ACCOUNTNAME(admin)PASSWORD(admin)"
 
recv buf1 155
       "DATALEN{{155}}000000USERID{{90}}USERNAME{{DMS"
       "/xcf/xb5/xcd/xb3"
       "WEB"
       "/xb2/xe9/xd1/xaf/xd5/xca/xbb/xa7"
       "}}USERDESCRIBE{{"
       "/xba/xfe/xd6/xdd/xb5/xe7/xc1/xa6/xbe/xd6"
       "//DMS"
       "/xcf/xb5/xcd/xb3"
       "WEB"
       "/xb2/xe9/xd1/xaf/xd5/xca/xbb/xa7"
       "}}DEPARTNAME{{"
       "/xce/xb4/xd6/xaa"
       "}}ADMIN{{0}}CLIENTSESSIONID{{2}}"
 
send buf2 53
       "CLIENTSESSIONID(2)OPERTYPE(INITDEPARTLIST)"
 
recv buf3 683
       "DATALEN{{683}}000000XMLDATA{{<?xml version=/"1.0/" encoding=/"GB2312/"?>/n"
       "<!DOCTYPE DepartList>/n"
       "<DepartList>/n"
       ………………………………………………………………………………………………
这里就省略了些数据。反正也看着也晕乎乎的。
这里说明一下,我这里是用GIS系统,需要sessionID关联的。我这上面的代码很简单,在buf1中有一个sessionID,在buf2中send时就用到了它。
2         回放一下
在不关联时回放是一定会有问题的。我回放的结果是:
Virtual User Script started
Starting action vuser_init.
Ending action vuser_init.
Running Vuser...
Starting iteration 1.
Starting action Action.
Action.c(4): lrs_create_socket(socket0, TCP, ...)
Action.c(6): lrs_send(socket0, buf0)
Action.c(8): lrs_receive(socket0, buf1)
Action.c(11): lrs_create_socket(socket1, TCP, ...)
Action.c(13): lrs_send(socket1, buf2)
Action.c(15): lrs_receive(socket1, buf3)
Action.c(15): Mismatch (expected 683 bytes, 42 bytes actually received)
Action.c(17): lrs_create_socket(socket2, TCP, ...)
Action.c(19): lrs_send(socket2, buf4)
Action.c(21): lrs_receive(socket2, buf5)
Action.c(21): Mismatch (expected 34143 bytes, 42 bytes actually received)
Action.c(23): lrs_create_socket(socket3, TCP, ...)
Action.c(25): lrs_send(socket3, buf6)
Action.c(27): lrs_receive(socket3, buf7)
Action.c(27): Mismatch (expected 100 bytes, 42 bytes actually received)
Action.c(29): lrs_create_socket(socket4, TCP, ...)
Action.c(31): lrs_send(socket4, buf8)
Action.c(33): lrs_receive(socket4, buf9)
Action.c(33): Mismatch (expected 134 bytes, 42 bytes actually received)
Action.c(35): lrs_send(socket4, buf10)
Action.c(38): lrs_receive(socket4, buf11)
Action.c(38): Mismatch (expected 17520 bytes, 42 bytes actually received)
Action.c(41): lrs_create_socket(socket5, TCP, ...)
Action.c(43): lrs_send(socket5, buf12)
Action.c(45): lrs_receive(socket5, buf13)
Ending action Action.
Ending iteration 1.
Ending Vuser...
Starting action vuser_end.
Ending action vuser_end.
Vuser Terminated.
主要来看一下蓝色的部分,因为没有关联,服务器是返回了42字节的数据,但是和录制时的数据是不同的。所以会mismatch。这里可以在LOG把Mismatch的值打印出来,不过太长了,我就不打印了。^@^。
3         转到树视图做关联
选择buf1看到数据:
DATALEN{{155}}000000USERID{{90}}USERNAME{{DMS/xcf/xb5/xcd/xb3WEB/xb2/xe9/xd1/xaf/xd5/xca/xbb/xa7}}USERDESCRIBE{{/xba/xfe/xd6/xdd/xb5/xe7/xc1/xa6/xbe/xd6//DMS/xcf/xb5/xcd/xb3WEB/xb2/xe9/xd1/xaf/xd5/xca/xbb/xa7}}DEPARTNAME{{/xce/xb4/xd6/xaa}}ADMIN{{0}}CLIENTSESSIONID{{2}}
选择CLIENTSESSIONID{{2}}中的2.右击后选择:create parameter。在弹出窗口中。看到默认的是用lrs_save_param,这个函数只能关联固定长度的数据。如果是固定的话,到这里点击一下OK,就关联成功了。LR会自动生成语句并且提示检查其他的需要关联的地方。弹出一个窗口提示。
而我这里的sessionID是动态的值。所以需要选择:extract parameter data using boundaries复选框。这时生成的语句是这样的:
lrs_save_searched_string( "socket0", LRS_LAST_RECEIVED, "Parameter3", NULL, NULL, -1, 152, 1 );
左右边界是NULL空的,这里点击left的浏览,弹出选择左边界的窗口,用鼠标选择:SESSIONID{{,点击Done。
再点击right的浏览,选择}}。
就确定了左右边界了。
这里的语句如下:
lrs_save_searched_string("socket0",LRS_LAST_RECEIVED,"Parameter4","LB/BIN=SESSIONID{{", "RB/BIN=}}", 1, 0, -1);
一路小跑点OK。
弹出提示是否替换所有符合左右边界的值。
点击yes。LR会自动搜索所有需要关联的地方并替换。
再转到脚本视图,看到脚本如下:
 lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=192.168.1.114:5560", LrsLastArg);
       lrs_send("socket0", "buf0", LrsLastArg);
       lrs_receive("socket0", "buf1", LrsLastArg);  
   lrs_save_searched_string("socket0", LRS_LAST_RECEIVED, "Parameter1", "LB/BIN=SESSIONID{{", "RB/BIN=}}", 1, 0, -1);
    lr_output_message("小样还抓不到你!你不就是: %s嘛!",lr_eval_string("{Parameter1}"));       lrs_create_socket("socket1", "TCP", "LocalHost=0", "RemoteHost=192.168.1.114:5560", LrsLastArg);
       lrs_send("socket1", "buf2", LrsLastArg);
       lrs_receive("socket1", "buf3", LrsLastArg);
看蓝色部分。后面一句输出是我加上去的。
这样就关联成功了。
4         再次回放
看到LOG如下:
Virtual User Script started
Starting action vuser_init.
Ending action vuser_init.
Running Vuser...
Starting iteration 1.
Starting action Action.
Action.c(4): lrs_create_socket(socket0, TCP, ...)
Action.c(6): lrs_send(socket0, buf0)
Action.c(8): lrs_receive(socket0, buf1)
Action.c(10): lrs_save_searched_string(socket0, get_last_received_buffer, Parameter1, LB/BIN=SESSIONID{{, RB/BIN=}}, 1, 0, -1)
Action.c(12): 小样还抓不到你!你不就是: 8嘛!
Action.c(14): lrs_create_socket(socket1, TCP, ...)
Action.c(16): lrs_send(socket1, buf2)
Action.c(18): lrs_receive(socket1, buf3)
Action.c(20): lrs_create_socket(socket2, TCP, ...)
Action.c(22): lrs_send(socket2, buf4)
Action.c(24): lrs_receive(socket2, buf5)
Action.c(26): lrs_create_socket(socket3, TCP, ...)
Action.c(28): lrs_send(socket3, buf6)
Action.c(30): lrs_receive(socket3, buf7)
Action.c(32): lrs_create_socket(socket4, TCP, ...)
Action.c(34): lrs_send(socket4, buf8)
Action.c(36): lrs_receive(socket4, buf9)
Action.c(38): lrs_send(socket4, buf10)
Action.c(41): lrs_receive(socket4, buf11)
Action.c(44): lrs_create_socket(socket5, TCP, ...)
Action.c(46): lrs_send(socket5, buf12)
Action.c(48): lrs_receive(socket5, buf13)
Ending action Action.
Ending iteration 1.
Ending Vuser...
Starting action vuser_end.
Ending action vuser_end.
Vuser Terminated.
看,输出了:
Action.c(12): 小样还抓不到你!你不就是: 8嘛!

LR中点鼠标做关联(winsock协议)的更多相关文章

  1. 转:如何在 LoadRunner 脚本中做关联 (Correlation)

    如何在 LoadRunner 脚本中做关联 (Correlation) 当录制脚本时,VuGen会拦截client端(浏览器)与server端(网站服务器)之间的对话,并且通通记录下来,产生脚本.在V ...

  2. loadrunner 如何做关联

    在页面中为了防止CRSF攻击,每次访问登录页面时,在浏览器器端生成一个token. 在提交时检验这个token是否有效,提交后token自动失效.   如果使用loadrunner来测试此系统话需要做 ...

  3. Jmeter_针对响应信息不明确的接口做关联

    下午写一个新功能的接口脚本,遇到几个技术问题,现在将解决方案写出来 1:做接口关联的时候,发现接口响应没有可以利用的信息.如下图只返回了一个成功的标识,这样的接口如何与之关联? 通过抓包观察后续的修改 ...

  4. Jmeter(十一)_针对响应信息不明确的接口做关联

    下午写一个新功能的接口脚本,遇到几个技术问题,现在将解决方案写出来 1:做接口关联的时候,发现接口响应没有可以利用的信息.如下图只返回了一个成功的标识,这样的接口如何与之关联? 通过抓包观察后续的修改 ...

  5. Jmeter之处理session、cookie以及如何做关联

    具体描述问题之前,我们先了解下session.cookie session.cookie的概念 1.session是放在服务器上的,过期与否取决于服务期的设定,cookie是存在客户端的,过去与否可以 ...

  6. 【MINA】用protobuf做编解码协议

    SOCKET协议 支持java serial 与 AMF3的混合协议,目前没有基于xml 与 json的实现. 协议说明: * 9个字节协议头+协议体. * * 协议头1-4字节表示协议长度 =协议体 ...

  7. 【JMeter】【性能测试】响应信息不明确的接口做关联

    1:做接口关联的时候,发现接口响应没有可以利用的信息.如下图只返回了一个成功的标识,这样的接口如何与之关联? 通过抓包观察后续的修改功能,发现需要传入一个id和一个title.但是前面的接口没有返回, ...

  8. 本地如何将svn和git管理的代码做关联

    svn和git都是广为流传的代码版本管理工具,实际项目中往往会将两者结合使用,那么如何将本地的一份代码和两者做有机的关联呢! 前提假设:项目已经在开发阶段中,此时变更了svn代码库的地址:或者是组里来 ...

  9. Windows网络编程笔记4 -- Winsock 协议相关知识

     Win32平台上的Winsock编程,Winsock是一个与协议无关的接口.以下协议是我们需要了解的: 网络协议的特征包括: 1.  面向消息 2.  面向连接和无线接 3.  可靠性和次序性 4. ...

随机推荐

  1. MongoDB add sharding -- Just a note

    1. Configure Configuration Server. 1.1. Create a directory: e.g. C:\data\dbs\config 1.2. Start confi ...

  2. SVN 版本服务器搭配全过程详解(含服务端、客户端)

    1.为什么要用VisualSVN Server,而不用Subversion? 回答: 因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Serve ...

  3. 使用Apache JMeter压測Thrift

    我这里以我的一篇帖子为样例 http://blog.csdn.net/mn960mn/article/details/50476759 这里已经有服务端了,先启动服务端 首先增加maven的依赖 &l ...

  4. mongo操作及相关资料

    mongo操作 find方法 db.collection_name.find(); 查询所有的结果: select * from users; db.users.find(); 指定返回那些列(键): ...

  5. ny42 一笔画问题

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. ...

  6. 【转】转 Linux调优方案,sysctl.conf的设置

      http://blog.sina.com.cn/s/blog_541086000100skq0.html proc/sys/net/ipv4/下各项的意义 http://blog.chinauni ...

  7. Spark的任务调度

    本文尝试从源码层面梳理Spark在任务调度与资源分配上的做法. 先从Executor和SchedulerBackend说起.Executor是真正执行任务的进程,本身拥有若干cpu和内存,可以执行以线 ...

  8. appium安卓自动化的 常用driver方法封装

    appium安卓自动化的 常用driver方法封装 做安卓自动化的时候,很多方法写起来会造成代码冗余,把这部分封装起来 ,添加到androidUI工具类里,随时可调用 都放在这个类下面: @Compo ...

  9. (Python mysql驱动的解决)_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h':问题的解决

    在win7下安装了Python后,想安装python-MySQL,使用pip安装出现如下问题: >pip install MySQL-python _mysql.c(42) : fatal er ...

  10. git hook部署代码

    git 提供了钩子功能,当某个操作发生时,可以执行某个动作. ftp上传时没有文件比较,虽然可以winscp提供了同步功能但是不够强大,而且文件多了,会花费比较长的时间. 1.先在主机上搭建一个git ...