本文主要讲述了Socket协议脚本的基础知识和编写方法,让大家能够在短时间内快速掌握简单的Socket协议脚本的编写方法。
1.socket协议介绍
Socket协议有万能协议之称,很多系统底层都是用的socket协议,用处十分广泛。
1.1 Socket通讯方式说明
与socket通讯有两种方式,一种是建立长连接,建立后不停的发送,接收;另一种是建立短连接,即建立连接发送报文,接收报文关闭连接
1.2 Socket协议发送的buf类型介绍
Send buffer类型分为字符串和xml类型
1.3 Socket协议脚本编写前提:
与项目组沟通,确认是否是socket协议,由项目组提供服务器IP和端口号还有socket协议交易的报文发送及接收报文对,及交易接口文档,了解清楚报文的数据长度,参数化字段,结构,代表什么等,了解清楚后进行socket协议脚本的开发。

1.4、Socket协议脚本函数说明及实例:

1)名称 lrs_create_socket();

创建socket连接,添加IP和端口号,如果创建成功返回值为0,反之则返回为非0数值。(对于长连接,建立socket连接放在vuser_init函数中,短连接放在Action中即可) 实例: lrs_create_socket("socket0","TCP","RemoteHost=180.170.150.230:7700",  LrsLastArg);

2)名称 lrs_send();

发送socket请求消息,取缓冲区buf0的报文并发送。

实例: lrs_send("socket0","buf1",LrsLastArg);

3)名称 lrs_receive();

接收socket的响应报文,放置buf1中。

实例:lrs_receive("socket0","buf2",LrsLastArg);

4)名称 lrs_get_last_received_buffer();

获取最后收到的buffer和大小,其中将最后收到的buffer的值赋给RecvBuf变量,将大小赋值给RecvLen。

实例:   lrs_get_last_received_buffer("socket0",&recvBuf,&recvLen);

5)名称 lrs_free_buffer();

为防止内存泄露,释放内存空间。

实例:  lrs_free_buffer(recvBuf);

6)名称 lrs_close_socket();

关闭Socket连接,(对于长连接,关闭socket连接应放在vuser_end函数中)

实例:  lrs_close_socket("socket0");

其他常用的Socket函数:

lrs_set_send_buffer("socket0", sSendPkg, iLenOfPkg );//指定要发送的socket信息
lrs_get_buffer_by_name("buf0", sSendPkg, iLenOfPkg);// 获取收到的buffer和大小
lrs_length_send("socket0","buf0",1,"Size=4","Encoding=1",LrsLastArg);
关联函数:
lrs_save_param_ex("socket0","received","",151,7,"ascii","response");//取指定位置字符串保存到变量,以便判断事务是否成功
lrs_save_searched_string();//在指定位置搜索字符串,将出现的字符串报错到参数中
超时函数
lrs_set_connect_timeout();//设置连接超时时间
lrs_set_recv_timeout();//设置服务器响应超时时间
lrs_set_recv_timeout2();//设置接收超时时间,使系统不去检查回收的内容是否一致

2、Socket脚本编写

2.1 简单划分步骤

这种方法是我无意在一片文章中看到的,总体说来,比较简单。就像把大象放进冰箱一样,总共分三步:

第一步:把冰箱门打开

//建立到服务端的连接

rc =    lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=128.64.64.23:8988", LrsLastArg);

if (rc==0)

lr_output_message("Socket  was successfully created ");

else

lr_output_message("An error occurred while creating the socket, Error Code: %d", rc);

第二步:把大象装进去

lrs_send("socket0", "buf0", LrsLastArg);   //往"socket0"发送"buf0"中的数据

lrs_receive("socket0", "buf1", LrsLastArg);//将"socke0"中返回的数据存放到"buf1"中

第三步:把冰箱门带上

//关闭连接

lrs_close_socket("socket0");

2.2 详细划分步骤

◇变量的声明与定义

◇ 创建socket连接

◇ 发送socket请求

◇ 接收socket响应

◇ 从返回Buffer 中抽取结果

◇ 结果判断

◇ 释放内存

◇ 断开连接。

2.3 实例脚本

下面我们就是用一个实际项目不同报文格式的脚本进行讲解;

若项目是短连接,且报文不是从文件中读取信息时,vuser_init和vuser_end部分默认即可,主要在Action中开发测试脚本和在data.ws中传输数据到Action的代码中。

Vuser_init.c

#include   "lrs.h"

vuser_init()

{

lrs_startup(257);

return 0;

}


Action.c

#include "lrs.h"

Action()

{

int rc,rv;//保存连接成功返回值

char *recvBuf;//保存接收数据的内容

int recvLen;//保存接收数据的大小

/*对于长连接,建立socket连接放在vuser_init函数中,短连接放在Action中即可*/

rc=lrs_create_socket("socket0","TCP","RemoteHost=IP:端口",  LrsLastArg);

//判断连接是否创建成功

if(rc==0){

lr_output_message("Socket连接创建成功");

}

else{

lr_error_message("Socket连接创建失败!错误码=%d",rc);

return -1;

}

lr_start_transaction("XXXX_1234_FCX");//事务开始

//发送socket请求消息(数据包内容放在data.ws中)

lrs_send("socket0", "buf0", LrsLastArg); //取缓冲区buf0的报文并发送

rv = lrs_receive("socket0", "buf1", LrsLastArg);//接收响应报文

if(rv==0){

lr_output_message("Socket接收返回消息成功");

}

else{

lr_error_message("Socket接收返回消息失败!错误码=%d",rv);

return -1;

}

//获取最后收到的buffer和大小

lrs_get_last_received_buffer("socket0",&recvBuf,&recvLen);

/*设置检查点,验证返回数据是否成功,这个根据各交易具体情况进行判断,以下示例是通过返回报文的长度大于3即为成功*/

if(recvLen>3){

lr_end_transaction("XXXX_1234_FCX ",PASS);

}

else{

lr_end_transaction("XXXX_1234_FCX ",FAIL);

lr_error_message("XXXX_1234_FCX Fail!出错信息:[%s]", recvBuf);//交易失败时,输出RecvBuf返回信息,用于排查出错原因

}

lrs_free_buffer(recvBuf); //释放recvBuf内存空间,否则会引起内存泄露

/*关闭Socket连接,对于长连接,关闭socket连接应放在vuser_end函数中*/

lrs_close_socket("socket0");

return 0;

}

Vuser_end.c

#include   "lrs.h"

vuser_end()

{

lrs_cleanup();

return 0;

}

data.ws

1)XML报文格式

;WSRData 2 1

send  buf0 360

"<?xmlversion=\"1.0\"encoding=\"GBK\"?>"

"<TRANINFO>"

"<HEAD>"

"<TransCode>S001</TransCode>"

"<TransDate>20170613</TransDate>"

"<TransTime>144206</TransTime>"

"<TransNo>21219603</TransNo>"

"<Operator>999088</Operator>"

"<TransInst>70090</TransInst>"

"</HEAD>"

"<MSG>"

"<CustomerID><userID></CustomerID>"

"<Type>3</Type>"

"<BusinessType>01</BusinessType>"

"</MSG>"

"</TRANINFO>"

recv buf1 300

-1

2)16进制报文格式

;WSRData 2 1

send  buf0 32

"\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"

" "

"\x00\x00\x00\x00"

"PID <tran>"

recv  buf1 197

"\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"

"\x1e\x00\x00\x00\x00"

"STW -1"

"\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"

"\x1e\x00\x00\x00\x00"

"STT "

"\x1f"

-1

其中buf0代表发送的报文的名称,后跟的数字代码发送报文长度,其下放置发送报文;buf1代表接收报文的名称,后跟数字代表接收报文长度,其下放置接收报文。

注意:该协议脚本参数化格式为:<参数名>

LR编写Socket脚本方法1(XML/16进制报文data.ws格式)的更多相关文章

  1. LR编写Socket脚本方法2(从文件读取报文)

      之前,给大家分享了LoadRunner编写socket协议脚本的基本方法与规则,今天给大家分享下,如何从本地文件,读取内容,并作为报文,发送到服务端:该方法也是在工作中遇到的一个难点,想通过这种方 ...

  2. shell给tcp或udp服务发送16进制报文指令

    指令:(sleep 2;echo "000F737D61747573" | xxd -r -p ;sleep 1)|nc 192.168.137.1 15000|hexdump - ...

  3. Go -- socket read的内容以16进制输出

    buf := make([]) reqLen, err := conn.Read(buf) // 遍历, 转为16进制 buffer := new(bytes.Buffer) for _, b := ...

  4. java利用16进制来辨别png格式的图片

    很多人知道利用.png的字符串结尾可以判断前端传入的图片是否为png格式,但是这只是潜意识的判断!那么如何利用png读写的特殊内容来深意识地判断图片格式呢?最近在做东西的时候遇到了点问题,在加载图片的 ...

  5. java byte数组与16进制间的相互转换

      java byte数组与16进制间的相互转换 CreationTime--2018年6月11日15点34分 Author:Marydon 1.准备工作 import java.util.Array ...

  6. 颜色转换、随机、16进制转换、HSV

    颜色转换.随机.16进制转换.HSV: /** * * *-----------------------------------------* * | *** 颜色转换.随机.16进制转换.HSV * ...

  7. python进制转化函数,10进制字符串互转,16进制字符串互转

    来了老弟,emmmmm,今天想到平时经常用到编码转化,把字符串转化为16进制绕过等等的,今天想着用python写个玩,查询了一些资料,看了些bolg 上面的两个函数是将二进制流转化为16进制,data ...

  8. C# Socket发送接收字节数组和十六16进制之间转换函数

    近期在使用远程网络模块的时候, 需要用的Socket发送数据,远程模块指令为16进制. 官方提供的DEMO比较繁琐.不方便新手使用. 下面的转换函数可大大方便新手使用. // 16进制字符串转字节数组 ...

  9. PHP 通过Socket收发16进制数据

    最近在php下做关于Socket通讯的相关内容,发现网络上好多人在了解如何进行16进制收发,研究了下,代码如下,欢迎拍砖. <?php        $sendStr = '30 32 30 3 ...

随机推荐

  1. 左右RAC CRS 自己主动启动

    左右CRS自己主动重新启动实验 一.检验ASM [root@rac1 ~]# /etc/init.d/oracleasm status Checking if ASM is loaded: yes C ...

  2. POJ 2954-Triangle(计算几何+皮克定理)

    职务地址:POJ 2954 意甲冠军:三个顶点的三角形,给出,内部需求格点数. 思考:就像POJ 1265. #include <stdio.h> #include <math.h& ...

  3. Chrome扩展,应用开发学习笔记之2---恶搞百度一下

    Chrome扩展,应用开发学习笔记之2 恶搞百度一下 前面我们介绍了一个最简单的chrome扩展时钟,如今我来介绍一下一个恶搞百度一下的chrome扩展程序. 前面说过,manifest.json文件 ...

  4. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...

  5. ATS项目更新(1) CC视图与备份路径同步

    1: subst t: /d 2: subst t: D:\PublicViews\Automation_Framework\SQA_ATE_DEV 3: 4: rem ** update folde ...

  6. 在Android程序中使用Modbus协议时报 java.net.SocketException: recvfrom failed: ECONNRESET解决办法

    最近在开发基本Modbus协议的Android端PLC控制程序,C#版程序没有任何问题,移到JAVA下出现各种问题,其中比较苦恼的是java.net.SocketException: recvfrom ...

  7. C++ string的那些坑,C++ string功能补充(类型互转,分割,合并,瘦身) ,c++ string的内存本质(简单明了的一个测试)

    1. size_type find_first_of( const basic_string &str, size_type index = 0 ); 查找在字符串中第一个与str中的某个字符 ...

  8. OpenGL(十三) Alpha测试、剪裁测试

    Alpha测试测试就是测试每一个像素的Alpha值是否满足某一个特定的条件,如果满足,则该像素会被绘制,如果不满足则不绘制,跟深度测试的机制是一样的,只不过深度测试考察的是像素的"深度&qu ...

  9. 新版【CefSharp】 禁用右键菜单 43.00+

    原文:新版[CefSharp] 禁用右键菜单 43.00+ 禁用右键菜单其实是很容易的.主就要是实现一个接口 IMenuHandler ,这个接口有一个  OnBeforeContextMenu 的方 ...

  10. MVC 添加数据的三种方法

    1 通过Request接收数据,进行添加 <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<d ...