脚本开发-利用loadrunner开发Windows Sockets协议脚本

by:授客 QQ1033553122

欢迎加入软件性能测试交流QQ群:7156436

实践举例

Socket服务端简单实现

新建Windows Sockets协议脚本:新建脚本时,协议选择“Windows Sockets”

代码组织结构:

注:

strlen

函数功能:返回字符串的字节大小

函数原型:size_t strlen( const char
*string );


运行结果:

用lrs_receive_ex函数

用lrs_receive函数

函数介绍

lrs_startup

函数功能:初始化WinSock DLL

函数原型:

int lrs_startup( int version );

参数说明:

version:Windows Socket的版本

返回值:函数执行成功则返回0,否则返回错误码

lrs_create_socket

函数功能:打开并初始化一个socket

函数原型:

int lrs_create_socket( char *s_desc, char *type, [ char*
LocalHost,] [char* peer,] [char *backlog,] LrsLastArg );

参数说明:

s_desc:还未绑定的socket的描述符,即socket名称

type: socket类型,TCP、UDP

LocalHost:可选参数,用于socket绑定的本地主机和端口,即客户端主机和端口,参数值格式:"LocalHost=
host_name/port_number",host_name可以是主机名称,也可以是ip地址。通常该参数在多网卡的情况下使用。

peer:对等的远程主机和端口号,即服务器主机和端口,参数值格式:"RemoteHost=host_name/port_number"

backlog:可选参数,等待连接队列最大长度,参数值格式:Backlog=number

LrsLastArg:标识参数列表结束的标记

返回值:函数执行成功则返回0,否则返回错误码

注:

确立一条TCP连接的过程,需要经过以下步骤:

操作(Operation)

WinSock

函数(VuGen function

Client/Server

Open socket

socket

lrs_create_socket

client and server

Name socket

bind

lrs_create_socket

client (optional) and
server

Prepare to associate with another
socket

listen

lrs_create_socket

server

Initiate association

connect

lrs_create_socket

client

Complete association

accept

lrs_accept_connection

server

Receive/Send

recv/send

lrs_receive/ lrs_send

client and server

确立一条UDP连接的过程,需要经过以下步骤:

Operation

WinSock

VuGen function

Client/Server

Open socket

socket

lrs_create_socket

client and server

Name socket

bind

lrs_create_socket

client and server

Associate Sockets:
Receive/Send

recvfrom /sendto

lrs_receive/ lrs_send

client and server

lrs_send

函数功能:发送数据

函数原型:

int lrs_send( char *s_desc, char *buf_desc, [char *target],
[char *flags,] LrsLastArg );

参数说明:

s_desc:已连接socket的描述符,即socket名称

buf_desc:发送缓冲区描述符号,即缓冲区名称

target:可选参数,目标主机即服务器主机名称、ip地址,参数值格式:
"TargetSocket=host:port"

flags:可选参数,接收和发送标识,指定调用方式,参数值格式:"Flags=flags"

LrsLastArg:标识参数列表结束的标记

返回值:函数执行成功则返回0,否则返回错误码

注意:

1)

如果函数没能成功发送缓冲区buffer中的所有数据,会继续尝试发送,直到超时时间,如果函数发送期间找不到可写入数据的socket,也会继续查找,直到超时。函数发送超时默认10秒,可通过lrs_set_send_timeout设置发送超时时间。

2)lrs_send发送数据成功,并不代表服务器接收成功。

lrs_set_send_timeout

函数功能:设置数据发送超时时间

函数原型:

void lrs_set_send_timeout( long sec, long u_sec
);

参数说明:

sec:以秒(second)为单位的超时时间

u_sec:以微秒(microsecond)为单位的超时时间

注意:总超时时间为 sec + u_sec

lrs_receive

函数功能:接收、读取数据

函数原型:

int lrs_receive( char
*s_desc, char *bufindex, [char *flags], LrsLastArg
);

参数说明:

s_desc:已连接socket的描述符,即socket名称

bufindex:接收缓冲区描述符号,即缓冲区名称

flags:可选参数,接收和发送标识,指定调用方式,参数值格式:"Flags=flags"

LrsLastArg:标识参数列表结束的标记

返回值:

函数执行成功则返回0,否则返回错误码。

注意:

函数执行成功并不代表接收完所有数据。如果远程服务器关闭了socket,函数执行完成不返回任何数据。

注意:


如果
data.ws中设置的接收(recv)缓冲区和实际收到的数据大小不匹配,在读取未超时的情况下,函数会一直读取由socket“搬运”过来的数据,直到已读取换缓冲区大小的数据,如果读取超时则提前结束读取操作。默认的超时时间为10秒,可用lrs_set_recv_timeout

lrs_set_recv_timeout2函数进行设置。所以data.ws中的recv需要认真设置,或者用lrs_receive_ex替代。

如果接收的数据和设置的缓冲区大小不一致,会报类似如下日志,并继续运行

Action.c(10): Mismatch in buffer's length (expected 11
bytes, 10 bytes actually received, difference in 1
bytes)

 

lrs_receive_ex

函数功能:lrs_receive的扩展,接收指定长度的数据

函数原型:

int lrs_receive_ex( char
*s_desc, char *bufindex, [char *flags,] [char
*size,] [char *terminator,] [char *mismatch,]
[char *RecordingSize,] LrsLastArg);

参数说明

s_desc:已连接socket的描述符,即socket名称

bufindex:发送缓冲区描述符号,即缓冲区名称

flags:可选参数,接收和发送标识,指定调用方式,参数值格式:"Flags=flags"

size:指定接收的字节数,参数值格式:"NumberOfBytesToRecv=xx",仅用于TCP socket

terminator:标记待接收数据块的结束字符(串),参数值格式:StringTerminator= value" or
"BinaryStringTerminator= value",仅用于TCP socket

mismatch:大小、内容不匹配的判断标准,参数值格式:"Mismatch= value"。参数可选值:MISMATCH_SIZE (默认)
或 MISMATCH_CONTENT

RecordingSize:录制期间接收的缓冲区大小,参数值格式:"RecordingSize"。仅用于TCP socket。

LrsLastArg:标识参数列表结束的标记

lrs_set_recv_timeout

函数功能:设置接收数据超时时间。

函数原型:

void lrs_set_recv_timeout( long sec, long u_sec
);

参数说明:

sec:以秒(second)为单位的超时时间,默认10s

u_sec:以微秒(microsecond)为单位的超时时间

lrs_disable_socket

函数功能:禁用socket的某个操作,注意不是网上说的,断开socket

函数原型:

int lrs_disable_socket( char *s_desc, int operation
);

参数说明:

s_desc  A descriptor
identifying a socket.

operation:需要禁用的操作:SEND, RECEIVE,
SEND-RECEIVE。比如,如果需要禁用发送数据传递
DISABLE_SEND,需要禁用所有活动(接收和发送),传递
DISABLE_SEND_RECV

lrs_close_socket

函数功能:关闭socket

函数原型:

int lrs_close_socket( char *s_desc );

参数描述:

s_desc:已连接socket的描述符,即socket名称

返回值:函数执行成功则返回0,否则返回错误码

注意:

对于TCP socket,lrs_close_socket函数会刷新所有还没发送的数据。

cleanup

函数功能:

终止WinSock DLL的使用。通常用于在脚本vuser_end action。

函数原型:

int lrs_cleanup( );

注意:不是所有WinSocket应用都会调用该函数

Loadrunner 脚本开发-利用loadrunner开发Windows Sockets协议脚本的更多相关文章

  1. Loadrunner 脚本开发-利用Loadrunner生成Web service测试脚本

    脚本开发-利用Loadrunner生成Web service测试脚本 1.选择协议--Web Service,如下图 2.导入服务 入口1:点击Manage Services ->弹出窗中选择“ ...

  2. 使用LR编写windows sockets协议xml报文格式脚本实战

    以下是测试脚本Demo: #include "lrs.h" Action() { char * resultCode;//结果代码 char * time; //系统时间 char ...

  3. C# Windows Sockets (Winsock) 接口 (转)

    在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现.System.Net 命名空间中 ...

  4. 性能测试总结工作总结-基于WebService协议脚本 内置函数手动编写

    LoadRunner基于WebService协议脚本 WebService协议脚本有三种生成方式,一种是直接通过LoadRunner导入URL自动解析生成:一种是使用LoadRunner内置函数手动编 ...

  5. Loadrunner 脚本开发-利用web_submit_data函数实现POST请求

    脚本开发-利用web_submit_data函数实现POST请求   by:授客 QQ:1033553122 概述 web_link()和web_url()函数都是页面访问型函数,实现HTTP请求中的 ...

  6. Loadrunner 脚本开发-利用web_custom_request函数进行接口测试

    脚本开发-利用web_custom_request函数进行接口测试 by:授客 QQ:1033553122 一.POST + JSON格式参数 例: web_custom_request(" ...

  7. 老李分享:Eclipse中开发性能测试loadrunner脚本

    老李分享:Eclipse中开发性能测试loadrunner脚本 前篇我分享了如何用loadrunner搭建javauser的性能测试脚本环境,本次我来告诉大家如何在eclipse开发loadrunne ...

  8. 品味性能之道<九>:利用Loadrunner编写socket性能测试脚本简述

            一.概述         Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作.     二.socket概述     ...

  9. 利用loadrunner代理方式,录制手机APP脚本

    利用loadrunner代理方式录制手机(iPhone.android)应用程序HTTP脚本 工具/原料 loadrunner 智能手机 方法/步骤   利用笔记本网卡或者类似360随身wifi,在安 ...

随机推荐

  1. 你不知道的JavaScript --- 作用域相关

    本篇是<你不知道的JavaScript>的读书笔记 什么是作用域? 程序离不变量,那么变量存储在哪里?程序需要时如何找到他们? 这些问题说明需要一套设计良好的规则来存储变量, 并且之后可以 ...

  2. springBoot(10)---logback日志

    logback日志 一.概述  和log4j优点: 实际上,这两个日志框架都出自同一个开发者之手,Logback 相对于 Log4J 有更多的优点 (1)logback不仅性能提升了,初始化内存加载也 ...

  3. 《HelloGitHub月刊》第 01 期

    <HelloGitHub月刊> 因为现在这个项目只有我自己做,只敢叫"月刊",希望有志同道合者,快点加入到这个项目中来!同时,如果您有更好的建议或者意见,欢迎联系我.联 ...

  4. Python数据科学“冷门”库

    Python是一种神奇的语言.事实上,它是近几年世界上发展最快的编程语言之一,它一次又一次证明了它在开发工作和数据科学立场各行业的实用性.整个Python系统和库是对于世界各地的用户(无论是初学者或者 ...

  5. [机器学习]回归--(Simple LR and Multiple LR)

    线性回归是最贴近生活的数据模型之一 简单的线性回归 简单的线性回归公式如下: 从公式中我们可以看出,简单线性回归只有一个自变量x1,b1是自变量的系数,y是因变量.x1可能是连续型或者离散型的数据,所 ...

  6. MySQL中支持emoji表情的存储

    由于需要实现emoji表情评论的功能,所以数据库需要支持emoji表情的存储,根据查询的资料最终实现了该功能,现将实现的过程以及过程遇到的一些问题记录下来,供大家参考和交流. mysql的utf8编码 ...

  7. Java——static关键字

    前言 static关键字算是Java中比较复杂的关键字之一,它可以修饰变量.方法.类以及代码块.下面将介绍static的具体使用. static引入的目的 static的作用 static修饰变量 s ...

  8. 详细介绍MySQL/MariaDB的锁

    官方手册:https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-transaction-model.html 1.事务提交的方式 在MariaD ...

  9. Perl的列表和数组

    列表和数组 列表 使用括号包围的元素,括号中的元素使用逗号隔开的是列表. 列表中的元素可以是字符串.数值.undef或它们的混合. 列表中的字符串元素需要使用引号包围. 空列表是括号中什么都没有的列表 ...

  10. 翻译:window function(已提交到MariaDB官方手册)

    本文为mariadb官方手册:window functions的译文. 原文:https://mariadb.com/kb/en/window-functions-overview/ 我提交到Mari ...