针对LoadRunner录制桌面应用,Windows Sockets协议适用于根据底层TCP/UDP通信的应用,而COM/DCOM协议则用于根据微软组件对象模型的分布式应用。
协议选择根据应用架构准确定位
Windows Sockets:当桌面应用没有数据库,或直接通过Socket和服务器进行底层数据交互时,应选择此协议。它能在套接字方面捕获所有流量,适用于自定义通信协议的情形。
COM/DCOM:当应用根据C++/ATL、VB6等技术创建,且通过COM组件进行内部或分布式交互(如使用OLEDB连接数据库)时,应选择此协议。
在开始录制对话框中,必须将Application type(应用程序类型) 设置为Win32 Application,而不是Web录制用的Internet Application,否则将无法正确捕获桌面应用的流量。
Windows Sockets协议实战
1. 录制配置
程序途径:在Program to record 中,填写目的桌面应用.exe文件的完整绝对途径。
代理设置:许多桌面应用不按照系统代理。为保证录制成功,需在录制选项中配置LoadRunner代理,一般端口为8520,并保证应用流量经过该代理。
2. 脚本结构和数据文件
LoadRunner会将Socket通信的数据包内容自动写入data.ws文件。脚本一般包括四个步骤:
建立连接:lrs_create_socket("socket0", "TCP", "RemoteHost=服务器IP:端口", LrsLastArg);
发送数据:lrs_send("socket0", "buf0", LrsLastArg);
接收数据:lrs_receive("socket0", "buf1", LrsLastArg);
关闭连接:lrs_close_socket("socket0");
对应的data.ws文件示如下:
text
send buf0 10
"00100312303456"
recv buf1 128
-1
其中,buf0和buf1后的数字代表该缓冲区的字节长度。
3. 脚本技巧
参数化:在data.ws中直接使用尖括号< >(而不是HTTP协议的大括号{})来定义参数,如"<username><password>",并在VuGen中创建对应的参数列表。
处理变长数据:当服务器返回的数据长度不固定时,lrs_receive会因预期长度不一致而读取失败。解决方案是改用lrs_receive_ex,分两次读取:先读取固定长度的包头,分析出包体大小,再读取包体。
c
// 先读取4字节包头
lrs_receive_ex("socket0", "buf1", "NumberOfBytesToRecv=4", LrsLastArg);
// 分析包头中的长度信息,再读取包体...
自定义数据发送:对于需要动态构造的二进制数据包,可使用lrs_set_send_buffer函数直接发送内存中的数据,这在处理加密或特定编码时非常有用。
COM/DCOM协议实战
1. 配置过滤器(Filter)
COM/DCOM录制的重要是过滤器的设置。在Recording Options > COM/DCOM > Filter中,你可以精确控制录制范围,避免捕获大量无关的底层调用,使脚本更简洁。
按类型库过滤:可以展开类型库(Type Library)树,取消勾选不需要录制的类(Class)或接口(Interface)。
按环境过滤:可以分组过滤ADO、RDS和远程对象(Remote Objects) 等特定环境,如,仅勾选ADO库,则只录制和ADO数据库操作相关的调用。
2. 录制限制和替代
注意:部分LoadRunner版本(如试用版)可能不包含COM/DCOM协议,或在2023等新版本中该协议已不可用。
如果COM/DCOM协议不可用,可考虑以下替代方案:
Visual Studio集成:利用LoadRunner和Visual Studio的集成功能进行测试。
GUI Virtual User:通过模拟用户界面操作来生成负载。
Citrix/RDP协议:如果应用通过远程桌面方式访问,可选用这些协议。
数据库协议:如果应用主要通过OLEDB/ODBC和数据库交互,可直接选用对应的数据库协议(如MS SQL Server、Oracle)。
问题排查
录制事件为0(无脚本生成):
检查协议选择是不是正确,可尝试使用Protocol Advisor功能辅助检测。
确定应用程序类型已设为Win32 Application。
对于Windows Sockets,检查代理设置,保证应用流量被正确重定向到LoadRunner代理端口。
脚本回放失败(尤其在Socket协议中):
检查data.ws中recv缓冲区的预期长度是不是和服务器实际返回长度一致。这是最常见的失败原因,可使用lrs_receive_ex动态处理。
注意lrs_receive_ex的语法,如"NumberOfBytesToRecv=4"前不要有多余空格,否则可能引发内存访问违规错误。
数据乱码或无法分析:
确定录制选项中已启用字符集支持(Support charset),并根据需要强制指定UTF-8等编码。
Windows Sockets协议是数据包的精确构造和参数化,而COM/DCOM协议则更依赖于前期的过滤器配置。根据应用技术栈选择正确的协议。