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

简介: Loadrunner 脚本开发-利用loadrunner开发Windows Sockets协议脚本

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


 

实践举例

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 );

 

参数说明:

versionWindows 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类型,TCPUDP

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设置发送超时时间。

2lrs_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_timeoutlrs_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 socketlrs_close_socket函数会刷新所有还没发送的数据。

 

cleanup

函数功能:

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

 

函数原型:

int lrs_cleanup( );

 

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

目录
相关文章
|
3月前
|
Linux Android开发 iOS开发
基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux
基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux
69 0
|
2月前
|
存储 数据可视化 数据库
InfluxData【付诸实践 01】Windows环境部署Telegraf+Influxdb+Grafana安装及使用配置(含百度云盘资源+demo脚本)
InfluxData【付诸实践 01】Windows环境部署Telegraf+Influxdb+Grafana安装及使用配置(含百度云盘资源+demo脚本)
37 0
|
2月前
|
监控 安全 API
7.2 Windows驱动开发:内核注册并监控对象回调
在笔者上一篇文章`《内核枚举进程与线程ObCall回调》`简单介绍了如何枚举系统中已经存在的`进程与线程`回调,本章`LyShark`将通过对象回调实现对进程线程的`句柄`监控,在内核中提供了`ObRegisterCallbacks`回调,使用这个内核`回调`函数,可注册一个`对象`回调,不过目前该函数`只能`监控进程与线程句柄操作,通过监控进程或线程句柄,可实现保护指定进程线程不被终止的目的。
7.2 Windows驱动开发:内核注册并监控对象回调
|
2月前
|
监控 安全 API
7.6 Windows驱动开发:内核监控FileObject文件回调
本篇文章与上一篇文章`《内核注册并监控对象回调》`所使用的方式是一样的都是使用`ObRegisterCallbacks`注册回调事件,只不过上一篇博文中`LyShark`将回调结构体`OB_OPERATION_REGISTRATION`中的`ObjectType`填充为了`PsProcessType`和`PsThreadType`格式从而实现监控进程与线程,本章我们需要将该结构填充为`IoFileObjectType`以此来实现对文件的监控,文件过滤驱动不仅仅可以用来监控文件的打开,还可以用它实现对文件的保护,一旦驱动加载则文件是不可被删除和改动的。
7.6 Windows驱动开发:内核监控FileObject文件回调
|
2月前
|
监控 安全 API
7.5 Windows驱动开发:监控Register注册表回调
在笔者前一篇文章`《内核枚举Registry注册表回调》`中实现了对注册表的枚举,本章将实现对注册表的监控,不同于32位系统在64位系统中,微软为我们提供了两个针对注册表的专用内核监控函数,通过这两个函数可以在不劫持内核API的前提下实现对注册表增加,删除,创建等事件的有效监控,注册表监视通常会通过`CmRegisterCallback`创建监控事件并传入自己的回调函数,与该创建对应的是`CmUnRegisterCallback`当注册表监控结束后可用于注销回调。
7.5 Windows驱动开发:监控Register注册表回调
|
2月前
|
存储 安全 数据安全/隐私保护
3.2 Windows驱动开发:内核CR3切换读写内存
CR3是一种控制寄存器,它是CPU中的一个专用寄存器,用于存储当前进程的页目录表的物理地址。在x86体系结构中,虚拟地址的翻译过程需要借助页表来完成。页表是由页目录表和页表组成的,页目录表存储了页表的物理地址,而页表存储了实际的物理页框地址。因此,页目录表的物理地址是虚拟地址翻译的关键之一。在操作系统中,每个进程都有自己的地址空间,地址空间中包含了进程的代码、数据和堆栈等信息。为了实现进程间的隔离和保护,操作系统会为每个进程分配独立的地址空间。在这个过程中,操作系统会将每个进程的页目录表的物理地址存储在它自己的CR3寄存器中。当进程切换时,操作系统会修改CR3寄存器的值,从而让CPU使用新的页
3.2 Windows驱动开发:内核CR3切换读写内存
|
2月前
|
监控 安全 API
7.1 Windows驱动开发:内核监控进程与线程回调
在前面的文章中`LyShark`一直在重复的实现对系统底层模块的枚举,今天我们将展开一个新的话题,内核监控,我们以`监控进程线程`创建为例,在`Win10`系统中监控进程与线程可以使用微软提供给我们的两个新函数来实现,此类函数的原理是创建一个回调事件,当有进程或线程被创建或者注销时,系统会通过回调机制将该进程相关信息优先返回给我们自己的函数待处理结束后再转向系统层。
7.1 Windows驱动开发:内核监控进程与线程回调
|
2月前
|
监控 Windows
4.4 Windows驱动开发:内核监控进程与线程创建
当你需要在Windows操作系统中监控进程的启动和退出时,可以使用`PsSetCreateProcessNotifyRoutineEx`函数来创建一个`MyCreateProcessNotifyEx`回调函数,该回调函数将在每个进程的创建和退出时被调用。PsSetCreateProcessNotifyRoutineEx 用于在系统启动后向内核注册一个回调函数,以监视新进程的创建和退出,
4.4 Windows驱动开发:内核监控进程与线程创建
|
2月前
|
监控 安全 Windows
4.3 Windows驱动开发:监控进程与线程对象操作
在内核中,可以使用`ObRegisterCallbacks`这个内核回调函数来实现监控进程和线程对象操作。通过注册一个`OB_CALLBACK_REGISTRATION`回调结构体,可以指定所需的回调函数和回调的监控类型。这个回调结构体包含了回调函数和监控的对象类型,还有一个`Altitude`字段,用于指定回调函数的优先级。优先级越高的回调函数会先被调用,如果某个回调函数返回了一个非NULL值,后续的回调函数就不会被调用。当有进程或线程对象创建、删除、复制或重命名时,内核会调用注册的回调函数。回调函数可以访问被监控对象的信息,如句柄、进程ID等,并可以采取相应的操作,如打印日志、记录信息等。
4.3 Windows驱动开发:监控进程与线程对象操作
|
3月前
|
存储 安全 API
3.5 Windows驱动开发:应用层与内核层内存映射
在上一篇博文`《内核通过PEB得到进程参数》`中我们通过使用`KeStackAttachProcess`附加进程的方式得到了该进程的PEB结构信息,本篇文章同样需要使用进程附加功能,但这次我们将实现一个更加有趣的功能,在某些情况下应用层与内核层需要共享一片内存区域通过这片区域可打通内核与应用层的隔离,此类功能的实现依附于MDL内存映射机制实现。
3.5 Windows驱动开发:应用层与内核层内存映射

相关产品

  • 云迁移中心