LoadRunner Winsocket 协议知识总结 tian.yuanwen@dcfs.digitalchina.com
LoadRunner Winsocket 协议知识总结
测试中心 田渊文
2007 年 11 月 9 日
1
LoadRunner Winsocket 协议知识总结 tian.yuanwen@dcfs.digitalchina.com
目 录
序 ...................................................................................................................................................... 1
修正版说明 ....................................................................................................................................... 2
一、函数........................................................................................................................................... 3
1.基本函数 ............................................................................................................................. 3
lrs_accept_connection 接受侦听套接字连接 ................................................................ 3
lrs_close_socket 关闭打开的套接字 .............................................................................. 3
lrs_create_socket 初始化套接字..................................................................................... 4
lrs_disable_socket 禁用套接字操作 ............................................................................... 4
lrs_exclude_socket 重播期间排除套接字 ...................................................................... 5
lrs_get_socket_attrib 获取套接字属性 ........................................................................... 6
lrs_get_socket_handler 获取指定套接字的套接字句柄 ............................................... 6
lrs_length_receive 接收来自指定长度的缓冲区的数据 ............................................... 7
lrs_length_send 向流套接字发送指定长度的缓冲区数据 ........................................... 7
lrs_receive 接收来自套接字的数据 ............................................................................... 7
lrs_receive_ex 接收指定长度的数据报或流套接字 ...................................................... 8
lrs_send 将数据发送到数据报上或流套接字中 ........................................................... 9
lrs_set_receive_option 设置套接字接收选项 .............................................................. 10
lrs_set_socket_handler 为指定的套接字设置处理句柄 ............................................. 11
lrs_set_socket_options 设置套接字选项 ...................................................................... 12
2.缓冲区函数 ....................................................................................................................... 13
lrs_free_buffer 释放分配给缓冲区的内存 ................................................................... 13
lrs_get_buffer_by_name 从数据文件中获取缓冲区及其大小 ................................... 13
lrs_get_last_received_buffer 获取套接字上最后接收到的缓冲区数据及其大小 ..... 14
lrs_get_last_received_buffer_size 获取套接字上接收到的最后一个缓冲区的大小 . 16
lrs_get_received_buffer 获取指定长度的最后接收到的缓冲区数据 ......................... 16
lrs_get_static_buffer 获取静态缓冲区或其一部分...................................................... 17
lrs_get_user_buffer 获取套接字的用户数据的内容 ................................................... 18
lrs_get_user_buffer_size 获取套接字的用户缓冲区的长度 ....................................... 19
lrs_set_send_buffer 指定要在套接字上发送的缓冲区 ............................................... 19
3.环境函数 ........................................................................................................................... 20
lrs_cleanup 终止 Windows 套接字 DLL 的使用 ....................................................... 20
lrs_startup 初始化 Windows 套接字 DLL .................................................................. 20
4.关联语句函数 ................................................................................................................... 21
lrs_save_param 将静态或接收到的缓冲区(或缓冲区部分)保存到参数中 .......... 21
2
LoadRunner Winsocket 协议知识总结 tian.yuanwen@dcfs.digitalchina.com
lrs_save_param_ex 将用户、静态或接收到的缓冲区(或缓冲区部分)保存到参数
中 ..................................................................................................................................... 22
lrs_save_searched_string 在静态或接收到的缓冲区中搜索出现的字符串,将出现字
符串的缓冲区部分保存到参数中 ................................................................................. 23
5.转换函数 ........................................................................................................................... 25
lrs_ascii_to_ebcdic 将缓冲区数据从 ASCII 格式转换成 EBCDIC 格式 .................... 25
lrs_decimal_to_hex_string 将十进制整数转换为十六进制字符串 ............................ 26
lrs_ebcdic_to_ascii 将缓冲区数据从 EBCDIC 格式转换成 ASCII 格式 ...................... 26
lrs_hex_string_to_int 将十六进制字符串转换为整数 ................................................. 27
6.超时函数 ........................................................................................................................... 28
lrs_set_accept_timeout 为接受套接字设置超时 ......................................................... 28
lrs_set_connect_timeout 为连接到套接字设置超时 .................................................. 28
lrs_set_recv_timeout 为接收套接字上的初始预期数据设置超时 ............................. 29
lrs_set_recv_timeout2 为建立连接后接收套接字上的预期数据设置超时 ............... 29
lrs_set_send_timeout 为发送套接字数据设置超时 .................................................... 30
7.Receive and Send Flags ..................................................................................................... 31
二、LRS 错误码 .............................................................................................................................. 31
三、常见问题 ................................................................................................................................. 39
1.一个完整的 VuGen 脚本(Winsocket TCP) .................................................................. 39
2.VuGen 脚本格式说明 ....................................................................................................... 46
3. 脚本的参数化 .................................................................................................................... 47
3.data.ws 中的 send 和 recv ................................................................................................ 47
4.Mismatch 的问题 .............................................................................................................. 47
5.lrs_receive 等待时间太长的问题 .................................................................................... 48
6.一个对上传数据处理的例子 ........................................................................................... 48
7.从文件中读取数据到用户缓冲区 ................................................................................... 49
8.10053 错误说明................................................................................................................ 51
9.编码方式 ........................................................................................................................... 51
四、本文档遗留问题 ..................................................................................................................... 51
五、知识链接 ................................................................................................................................. 52
1.带外数据(out‐of‐band,OOB) .......................................................................................... 52
2.阻塞和非阻塞(blocking 和 non‐blocking) .................................................................. 52
3.TCP_NODELAY 和 TCP_CORK ............................................................................................ 53
4.什么是句柄 ....................................................................................................................... 54
六、结束语 ..................................................................................................................................... 55
3
LoadRunner Winsocket 协议知识总结 tian.yuanwen@dcfs.digitalchina.com
序
初次接触 LoadRunner Windows Sockets 协议是在做 Tuxedo 客户端软加密性能测试的时
候,由于从来没有接触过 socket 协议,因此当时碰到了很多的问题,不过过程虽然有点曲
折,但在大家的帮助下还是问题都得到了很好的解决。当时就想对一些问题总结一下,不过
想想自己了解到的东西还是太少了,等再多了解一些再说吧,免得班门弄斧,贻笑大方。幸
运的是因项目需要,很快就又有机会接触到 LR 的 Socket 协议。在后来的测试过程中,确实
对 socket 协议的脚本编写有了更深的了解,接触到了更多的函数,当然也遇到了一些新问
题,而解决问题的过程本身又是一个深入学习的过程。
最近也有一些时间来学习一些自己想学的东西,便想着能整理一下 LR Socket 的相关内
容,一是为自己理清一下思路以备忘(本人记性很不好,呵呵),二是在整理过程中也得到
了大家的认可。因此最后决定将原本随便整理一下的想法修正一下,就是希望能系统一点,
把所有的函数和曾经遇到过的问题都写出来,在共享的基础上能够共同探讨。但是由于本人
在技术上本就是一只菜鸟,再加上 English 也不怎么样,因此花了比预期更多的时间,甚感
惭愧。
其实这些内容只能算是铺个底吧,很多细节性的问题还需要大家一块探讨,在实践中进
行验证。由于本人水平有限,文中纰漏甚至错误之处在所难免,还望大家不吝指正。
在此向所有在工作中帮助过我的同事们表示衷心的感谢!
1
LoadRunner Winsocket 协议知识总结 tian.yuanwen@dcfs.digitalchina.com
修正版说明
由于时间关系,1.0 版中存在很多不足,很多地方解释的不够清楚,本次修正及补充的
内容主要包括以下几个方面:
1、对文档中的一些错字、别字进行了校正;
2、对文档中的绝大多数函数进行了较为详细的补充说明及用法;
3、对文档中涉及到的所有脚本实例进行了调试(LoadRunner8.0 下)并全部通过;
4、“常见问题”中增加了一个从文件中读取数据的方法介绍;
5、增加了“知识链接”部分,旨在加深对相关函数的理解。
由于本人水平有限,编写这个文档花了较多的时间,到现在总算可以正式发布了。虽然
是修正版,但文档中也难免一些纰漏或错误,特别是对 lrs_length_receive 和 lrs_length_send
两个函数还是没有彻底搞清楚,这也是我最为遗憾之处,对于文档的完整性也是一个缺憾,
真诚地希望这方面的高手能给予指点。
其实我编写此文档的初衷是很简单的,就是希望在整理、总结的过程中能够加深对这方
面知识的理解和掌握,后来此想法得到了项目组同事们的大力支持,于是就希望能写得完整
一点,在此也对他们再次表示衷心地感谢!现在这个文档可以说是基本完成了,如果说要给
自己定位的话,我觉得更多的程度上自己只是一个资源整合者,因为很多知识点前辈们都已
经总结得很好了,只是没有人去整合、去归纳(也可能是我们没有找到而已),而本文档的
编写就是完成了这样一个任务,只是在其中融入了我自己的实践而已。
2
LoadRunner Winsocket 协议知识总结 tian.yuanwen@dcfs.digitalchina.com
一、函数
1.基本函数
lrs_accept_connection 接受侦听套接字连接
格式:
int lrs_accept_connection ( char *old_socket, char *new_socket );
参数说明:
old_socket: 被侦听的套接字标识符,如 socket0。
new_socket: 侦听到请求时建立的新套接字标识符,如 socket1。
返回值:
成功返回 0。
用法:
lrs_accept_connection(“socket0”,”socket1”);
函数说明:
函数从 old_socket 上的挂起连接队列中取出第一个连接,使用相同属性创建新的套接
字。原来的套接字对于其他连接仍然可用。
实际的侦听机制是:当 accept 函数监视的 old_socket 收到连接请求时,old_socket 执行
体将建立一个新的 socket 连接(标识符为 new_socket),收到服务请求的初始 socket(即
old_socket)仍可以继续在以前的 socket 上监听,同时可以在新的 socket 描述符上进行数据
传输操作。
lrs_close_socket 关闭打开的套接字
格式:
int lrs_close_socket ( char *s_desc );
参数说明:
s_desc: 已打开的套接字标识符。
返回值:
成功返回 0,否则返回失败错误码。
用法:
lrs_close_socket(“socket0”);
3
LoadRunner Winsocket 协议知识总结 tian.yuanwen@dcfs.digitalchina.com
lrs_create_socket 初始化套接字
格式:
int lrs_create_socket ( char *s_desc, char *type, [ char* LocalHost,] [char* peer,] [char
*backlog,] LrsLastArg );
参数说明:
S_desc: 要初始化的套接字标识符,如 socket0。
type: 套接字类型,有 TCP 和 UDP 两种。
LocalHost: 绑定套接字的本地地址、端口,如 LocalHost=4002,也可以在端口前面加上
本机名称或 IP 地址,如 LocalHost=overn:4002,或 LocalHost=168.3.4.127:4002。可选。
peer: 处理套接字请求的远程机端口,如 RemoteHost=168.3.1.230:6666。可选。
backlog: 请求连接队列的最大长度,如 backlog=20,可选。
LrsLastArg: 参数结束标志
返回值:
初始化成功返回 0;如果是 VuG 错误则返回 VuG 错误码,如果是套接字错误则返回
Windows 套接字错误码。错误码详见第三部分。
用法:
lrs_create_socket("socket0", "UDP", "LocalHost=4002", LrsLastArg);
lrs_create_socket("socket0", "TCP", "RemoteHost=168.3.1.230:6666", LrsLastArg);
函数说明:
lrs_create_socket 函数用来初始化一个套接字。该函数通过执行 socket 命令来打开一个
新的套接字连接。如果提供 LocalHost 参数它将执行 bind 命令来绑定该套接字;如果指定 peer
参数它将执行 connect 命令和远端主机建立一个连接;如果提供 backlog 参数将会执行 listen
命令来侦听该套接字。Backlog 对队列中等待服务的请求的数目进行了限制,大多数系统缺
省值为 20。如果一个服务请求到来时,请求队列已满,该 socket 将拒绝连接请求,客户端
将会收到一个出错信息
指定 LocalHost 时可以在端口前加上主机名(如"LocalHost=overn:80"),如果主机的 IP 地
址是绑定的也可以指定为它的 IP 地址,如"LocalHost=168.3.4.127:6666"。
该函数在客户端或服务器端的 Windows Socket 会话期间都会被自动记录,如果是客户
端会话则 peer 和 port 两个参数会被记录,如果是服务器端则会记录 port 和 backlog。
lrs_disable_socket 禁用套接字操作
格式:
4
LoadRunner Winsocket 协议知识总结 tian.yuanwen@dcfs.digitalchina.com
int lrs_disable_socket ( char *s_desc, int operation );
参数说明:
s_desc: 要禁用的套接字标识符。
operation: 禁用的操作类型,有 SEND,RECEIVE,SEND‐RECEIVE 三种。
返回值:
成功返回 0,否则返回失败错误码。
用法:
lrs_diable_socket(“socket0”,DISABLE_SEND);
lrs_exclude_socket 重播期间排除套接字
格式:
int lrs_exclude_socket ( char *s_desc );
参数说明:
s_desc: 要排除的套接字标识符
返回值:
用法:
lrs_exclude_socket("socket1");
lrs_create_socket("socket0", "TCP", "RemoteHost=168.3.1.230:6666", LrsLastArg);
lrs_set_recv_timeout2(1,0);
lrs_receive("socket0", "buf0", LrsLastArg);
lrs_send("socket0", "buf1", LrsLastArg);
lrs_receive("socket0", "buf2", LrsLastArg);
/****以下所有 socket1 的操作都将被忽略****/
lrs_create_socket("socket1", "TCP", "RemoteHost=168.3.1.230:6666", LrsLastArg);
lrs_set_recv_timeout2(1,0);
lrs_receive("socket1", "buf49", LrsLastArg);
lrs_send("socket1", "buf50", LrsLastArg);
lrs_receive("socket1", "buf51", LrsLastArg);
lrs_send("socket1", "buf52", LrsLastArg);
lrs_receive("socket1", "buf53", LrsLastArg);
/****下面 socket2 的操作将正常执行****/
lrs_create_socket("socket2", "TCP", "RemoteHost=168.3.1.230:6666", LrsLastArg);
lrs_set_recv_timeout2(1,0);
5