Loadrunner中socket协议中的三个关联函数

这3个函数其实都可以动态获取运行中收到的数据包中的数据,只要跟在要获取的收取数据包脚本后面即可。其中lrs_save_searched_string和lrs_save_param如果buf_desc指明buf名称,则从我们录制的data.ws中获取数据,所以每次这个值都是固定值,不会改变的;比如订单提交的确认信息等;而如果lrs_save_searched_string和lrs_save_param参数buf_desc设置为NULL,则从脚本中每次返回的数据包中获取数据,这个数据也随着每次脚本的动态运行而变化,比如某个不断递增的ID号等。而lrs_save_param_ex 的buf_desc有3个参数,其中static指的是从我们在脚本中定义的一个静态变量中取值,而received指的是从收到的数据包取值;而user指从data.ws文件中取值。这个一定要搞清楚。关于这个函数,这里再次提供下最原始的说明

type  

The type of buffer data to save into the parameter. Possible values: 

user        - save the user data,
static        - save the static buffer that was originally recorded,
received        - save the buffer(s) received by the last call to lrs_receive.  

buff  

Depends on the type of buffer data specified in the type parameter.
For user               the pointer to the user buffer,
For static       -               the descriptor of the buffer in the data file,
For received       the buff parameter is ignored.  
user:实例
char *ParamBuf = "(size=\x05)" 
lrs_save_param_ex("socket0", "user", ParamBuf, 0, strlen(ParamBuf),"ascii", "size_param"); 
static实例
lrs_save_param_ex("socket0", "user", "buf1", 0, 23,"ascii", "param"); 
received实例
lrs_save_param_ex("socket0", NULL, "buf1", 0, 23,"ascii", "param"); 

---------------------------------------------------------------------------------------------------
    
        //实例1
        lrs_save_searched_string("socke0","buf1","wtbh","LB/BIN=|","RB/BIN=|",2,0,-1);

//输出结果 "wtbh = 10000013" 。原始数据为"0|普通指令下达成功|10000031|"。那就是在以左边界和右边界第2次出现的地方,
        //获取左右边界里面的所有的值

//实例2
        lrs_save_searched_string("socke0","buf1","wtbh","LB/BIN=|","RB/BIN=|",1,0,-1);

//输出结果"wtbh = 普通指令下达成功"原始数据为"0|普通指令下达成功|10000031|"。那就是在以左边界和右边界第1次出现的地方,
        //获取左右边界里面的所有的值

//实例3
        lrs_save_searched_string("socke0","buf1","wtbh","LB/BIN=|","RB/BIN=|",1,4,-1);

//输出结果"wtbh = 指令下达成功"原始数据为"0|普通指令下达成功|10000031|"。那就是在以左边界和右边界第1次出现的地方,
        //获取左边界为起点的第4个字符后面的数据。

//实例4
        lrs_save_param("socket0","buf1","wtbh", 34, 8);
        
        //从数据包中第34个字符开始连续取8个字符。
        
        //实例5
            
        char * ReceivedBuffer;
        
        int iLen = 0;
        
        int iFor = 2;
        
        lrs_get_last_received_buffer("socket0", &ReceivedBuffer, &iLen); 
        
        lrs_save_param_ex("socket0", "user", ReceivedBuffer, 0, 43, "ascii", "test_para");
        
        lrs_free_buffer(ReceivedBuffer);

strZhwth = lr_eval_string("<test_para>");
        
        strZhwth = (char *)strtok(strZhwth,"|");
        
        while(iFor > 0)
        {
            iFor = iFor - 1;
            strZhwth = (char *)strtok(NULL,"|");//获取下一个token
        }
        //通过上面的循环获取了第2个“|”后面的字符,并且保存到strZhwth中
        lrs_save_param_ex("socket0", "user", strZhwth, 0, 8, "ascii", "Zhwth"); 
        //在上面获取字符中从第1位开始连续获取8个字符。
        //函数实例6
        函数strtok
        说明Returns a token from a string delimited by specified characters. 
        定义char *strtok ( char *string, const char *delimiters ); 
        参数string The string to scan.  delimiters The string consisting of the character or characters that delimit tokens in the first string. 
        实例
       extern char * strtok(char * string, const char * delimiters ); // Explicit declaration 
       char path[] = "c:\\mercury\\lrun\\bin\\wlrun.exe"; 
       char separators[] = ".\\"; 
       char * token; 
       token = (char *)strtok(path, separators); // Get the first token 
       if (!token) { 
              lr_output_message ("No tokens found in string!"); 
              return( -1 ); 
       } 
       while (token != NULL ) { // While valid tokens are returned 
              lr_output_message ("%s", token ); 
              token = (char *)strtok(NULL, separators); // Get the next token 
       } 
        Output:
        Action.c(18): c:
        Action.c(18): mercury
        Action.c(18): lrun
        Action.c(18): bin
        Action.c(18): wlrun
        Action.c(18): exe 
        //函数实例7
        函数strstr
        说明Returns the first occurrence of one string in another. 
        定义char *strstr ( const char *string1, const char *string2 ); 
        参数string1The string that is searched.  string2The string that is searched for in the first string.  
        实例1
        lrs_save_param_ex("socket0", "user", ReceivedBuffer_cjhb, 0, iLenCj, "ascii", "cjhb");
        lrs_free_buffer(ReceivedBuffer_cjhb); 
        if(strstr(lr_eval_string("<cjhb>"), "已成交") != NULL)
        return 0;
        实例2
        After strstr returns the address, position, the code then calculates the word‘s place in str by subtracting the address of the start of the string from position. This is the offset of the word "dog", in bytes.

int offset; 
       char * position; 
       char * str = "The quick brown dog jumps over the lazy fox"; 
       char * search_str = "dog"; 
       position = (char *)strstr(str, search_str);

// strstr has returned the address. Now calculate * the offset from the beginning of str 
       offset = (int)(position - str + 1); 
       lr_output_message ("The string \"%s\" was found at position %d", search_str, offset); 
        Output:
        Action.c(14): The string "dog" was found at position 17

//函数实例8
        函数strcmp
        说明Compares string1 and string2 to determine the alphabetic order.
        定义int  ( const char *string1, const char *string2 );
        参数string1  The first string that is compared.  string2  The second string that is compared.strcmp compares string1 and string2 to determine the alphabetic order.   
        实例1
        The following example compares two strings, string1 and string2, which are identical except for the word "quick" which is lowercase in string1 and uppercase in string2. strcmp, which is case-sensitive, returns an unequal comparison. 
       int result; 
       char tmp[20]; 
       char string1[] = "The quick brown dog jumps over the lazy fox"; 
       char string2[] = "The QUICK brown dog jumps over the lazy fox"; 
       result = strcmp( string1, string2); // Case-sensitive comparison 
       if(result > 0) 
              strcpy(tmp, "greater than"); 
       else if(result < 0) 
              strcpy(tmp, "less than"); 
       else 
              strcpy(tmp, "equal to"); 
       lr_output_message ("strcmp: String 1 is %s string 2", tmp); 
       result = stricmp(string1, string2 ); // Case-insensitive comparison 
       if( result > 0 ) 
              strcpy( tmp, "greater than" ); 
       else if( result < 0 ) 
              strcpy( tmp, "less than" ); 
       else 
              strcpy( tmp, "equal to" ); 
       lr_output_message( "stricmp: String 1 is %s string 2", tmp ); 
        Output:
        Action.c(17): strcmp: String 1 is greater than string 2
        Action.c(28): stricmp: String 1 is equal to string 2

单词descriptor identifying 标识符描述

时间: 2024-10-05 10:58:43

Loadrunner中socket协议中的三个关联函数的相关文章

自行控制loadrunner的socket协议性能测试 (转)

一前言 二任务的提出 三实现方案讨论 四技术要点讲解 如何开始录制一个最简单的收发数据包脚本 写日志文件 一行一行读数据包文件 字符串转换为十六进制数据包 发送自己定义的数据包 接收数据包到自定义缓冲区 从自定义缓冲区读出数据 如何释放自定义缓冲区 如何根据数据包返回计算为十进制数 五小节 摘要:通过实例讲解loadrunner中的socket协议性能测试的一种测试方法,如何不依赖loadrunner既定规则,自行控制收发数据包 关键词:Loadrunner,socket,自行控制,收发数据包

loadrunner使用socket协议来实现客户端对服务器产生压力实例。(通过发送心跳包,达到连接多个客户端的目的)

#include "lrs.h" vuser_init(){ char *ip; int handler; //编写获取LR分配的Vuser IP函数,将IP保存在ip变量中. ip=lr_get_vuser_ip(); if(ip) lr_vuser_status_message("the ip address is %s:",ip); else lr_vuser_status_message("IP spooler disabled"); /

LoadRunner编写Socket协议脚本方法

本文主要介绍使用LoadRunner手工编写Windows Socket协议测试脚本的方法. 通过LoadRunner编写Windows Socket协议测试脚本,总体说来,比较简单.就像把大象放进冰箱一样,总共分三步: 第一步:把冰箱门打开 //建立到服务端的连接 rc =    lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=128.64.64.23:89

Swift中声明协议中的class关键字的作用

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近在Cocos2D编程for Swift中看到以下一个代码片段: protocol GameMode:class{ var userInterface:CCNode! {get} func gameplay(mainScene:MainScene,droppedFallingObject:FallingObject) func gameplay(mainSc

loadrunner socket协议问题归纳(3)

摘要:通过实例讲解loadrunner中的socket协议性能测试的一种测试方法,如何不依赖loadrunner既定规则,自行控制收发数据包 关键词:Loadrunner,socket,自行控制,收发数据包 一.前言 用过loadrunner的socket协议进行性能测试的同学都知道,只需要录制短短的几句命令,就可以实现socket的链接.收发数据包和关闭链接,一时大爽,不过紧跟着的就是没完没了的折磨.刚开始参数化数据包发送接收都行,慢慢的发现,很多情况下,收发数据包的长度和内容都是不可确定的,

TCP协议中的三次握手和四次挥手(图解)【转】

建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. [更新于2017.01.04 ]该部分内容配图有误,请大家见谅,正确的配图如下,错误配图也不删了,大家可以比较下,对比理解效果更好.这么久才来更新,抱歉!! 错误配图如下: 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源.Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了. 那如何断开连接呢?

IP地址的三种表示格式及在Socket编程中的应用

转自:http://blog.csdn.net/hguisu/article/details/7449955 使用TCP/IP协议进行网络应用开发的朋友首先要面对的就是对IP地址信息的处理.IP地址其实有三种不同的表示格式:  1)Ascii(网络点分字符串)-        2) 网络地址(32位无符号整形,网络字节序,大头)        3)主机地址 (主机字节序)   IP地址是IP网络中数据传输的依据,它标识了IP网络中的一个连接,一台主机可以有多个IP地址,IP分组中的IP地址在网络

网络协议中HTTP,TCP,UDP,Socket,WebSocket的优缺点/区别

先说一下网络的层级:由下往上分为 物理层.数据链路层.网络层.传输层.会话层.表示层和应用层 1.TCP和UDP TCP:是面向连接的一种传输控制协议.属于传输层协议.TCP连接之后,客户端和服务器可以互相发送和接收消息,在客户端或者服务器没有主动断开之前,连接一直存在属于长连接. 优点:安全.传输数据无大小限制.准确可靠,先发先至 缺点:效率低,不能做离线任务.连接有耗时 UDP:是面向非连接的用户数据报协议.属于传输层协议.所谓的无连接就是在传输数据之前不需要交换信息,没有握手建立连接的过程

loadrunner socket协议问题归纳(0)

一.概述 Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作. 二.socket概述 socket是操作系统中I/O系统的网络延伸部分,它扩展了操作系统的基本I/O到网络通信,使进程和机器之间的通信成为可能.如果想完全地理解socket在Loadrunner中如何工作的,熟悉一些关于它的历史会很有帮助. 当前常用的socket,最早起源于BSD UNIX类的操作系统.在UNIX系统上,比如BSD,把对网络的支持加入操作系统,以一