通用服务器桩-Receiver使用说明文档

简介:

1 背景
“驱动+桩”是一种比较成熟的服务器端模块测试模式,易于实施自动化。
Receiver应用于桩构建的场景,提高构建服务器端测试桩的效率,在大多数应用场景下用户可以通过配置xml文件实习桩功能,支持功能和性能测试使用
Receiver只支持linux环境使用
2 名词解释
A模式: 普通xml解析模式
B模式: 逻辑xml解析模式
C模式: so加载模式
3 功能
 ※能够模拟提供二进制socket接口的服务器程序 
 ※能够支持功能与性能的要求
 ※提供三种使用模式:
(1) 普通xml解析模式(模拟单个接口,指定接口格式及回报数据)
(2) 逻辑xml解析模式(模拟多个接口,除指定接口格式及回报数据外,定制部分逻辑)
(3) so加载模式(特殊场景使用,用户可以自己实现包处理函数)
※ 提供各类辅助函数, 帮助更快速的开发桩程序
4 使用说明
4.1 普通xml模式
假设一个服务器模块提供的某个socket接口请求格式为header+req1,回包格式为header+resp1,struct描述如下:
struct header{
int cmd;
char provider[200]; 
int len;
};
struct req1{
int id;
};
Struct item{
Int a;
Int b;
};
struct resp1{
int result;
char name[50];
int count;
struct item items[];
};
那么我们需要先构造三个xml描述
 ※header1.xml
<packet type="struct" repeat="1" value=" header" endian="0">
<cmd type="int32_t" value="" repeat="1"/>
<provider type="char" value="" repeat="200"/>
<len type=”int32_t” value=” #flowlen()” repeat="1">
</packet>
 ※req1.xml
<packet type="struct" repeat="1" value=" req1" endian="0">
<id type="int32_t" value="" repeat="1"/>
</packet>
※ resp1.xml
<packet type="struct" repeat="1" value=" resp1" endian="0">
<result type="int32_t" value="$TEMPRESULT" repeat="1"/>
<name type="char" value="hello world" repeat="50"/>
<count type="int32_t" value="5" repeat="1"/>
<items type="struct" repeat="@count" value=" ">
<a type="int32_t" value="1" repeat="1"/>
<b type="int32_t" value="2" repeat="1"/>
</items>
</packet>

注:endian用来描述字节序,0为主机序(默认)
Repeat用于指定该数据段重复数字,用于数组定义,也可以用在struct的描述上
Type为该字段类型,工具内置类型见附录
#flowlen()为内置函数,指定此处自动计算,根据后面所有结构体的长度计算,其他关键字见附录
$TEMPRESULT表示从环境变量TEMPRESULT中读取数据
@count 表示该字段值由<count type="int32_t" value="5" repeat="1"/>值反填,也就是5
回包值可以指定固定值、从环境变量中读取或者利用random内置函数随机生成
运行receiver:./receiver –p 3306 –r ./header.xml –r req1.xml –s header.xml –s resp1.xml -l 1 -u 0 -n -1 即可模拟这个服务器的接口
那么当receiver收到一个header+req1的请求,它会回一个header+resp1的应答(result为对应系统变量实际值,name为hello world),-l 1表示长连接, -u 0 表示tcp请求, -n -1 表示receiver不会退出,一直处理请求

4.2 逻辑xml模式
上个例子给出了模拟一个服务器程序单一接口的使用方法,逻辑xml主要用于模拟一个程序多个接口的场景。
假设说某模块提供的接口格式如下:
header1+header2+reqX
回包格式为:
header1+header2+respX
(X为未知数,具体请求与回应的结构体由header2中的cmd域来定义,例如如果cmd取值为5,则请求为header1+header2+req5,回应为header1+header2+resp5)
我们想启动一个桩实例来模拟这些接口,那么可以使用逻辑xml模式,逻辑xmll的使用方法如下:
首先构造逻辑xml:
[gaowei@db-testing-cs33.db01.baidu.com receiver]$ cat xml/config.xml 
<config>
<req_header path="header1.xml" /><!—请求包头1-->

<req_header path="header2.xml " key="cmd" /><!—请求包头2,这个结构体中的cmd决定如何回包--> 
<resp_body key="1" respkey="5" path="resp1.xml " /><!—如果cmd为1,则用resp1回包 -->
<resp_body key="2" respkey="6" path="resp2.xml" /><!—如果cmd为2,则用resp2回包 -->
</config>
运行receiver:./receiver –p 3306 –b config.xml -l 1 -u 0 -n -1 –t 5即可模拟这个服务器的多个接口
4.3 so模式
如果以上两种方式不能满足用户需求,用户可以继承receiver提供的plugin基类,实现自己的包处理函数
class IPlugin
{
public:
IPlugin( const std::string& name) ;
virtual ~IPlugin();
virtual const std::string& GetPluginName();
virtual void Process( void *);
protected:
std::string m_strPluginName;
};

Receiver使用了Epool和线程池模型,当有socket可读,会立刻回调用户的Process( void *)函数,传给用户socket句柄,用户可自行执行收包及处理函数
一个简单示例如下:
testplugin.h:
#include "plugin.h"
class TestPlugin: public IPlugin{
public:
TestPlugin():IPlugin("testplugin"){
printf("create TestPlugin\n");
}
void Process( void *);
};

testplugin.cpp:
#include "testplugin.h"
#include "mysocket.h"
#include <iostream>
using namespace std;

extern "C"
TestPlugin* create_testplugin()
{
return new TestPlugin();
}
void TestPlugin::Process(void * p){
int sock = (int)p;
cout << " handle epool event , socket= " << sock << endl;
SocketLayer::close_delepoll(sock);
}
5 工具参数
receiver三种模式: xml模式(A),逻辑xml模式(B),so模式(C),参数含义如下:
 -r 指定接收的结构体描述,A模式使用
 -s 指定发送的普通结构体描述,A模式使用
 -m 指定发送的mcpack1结构体描述,A模式使用
 -x 指定发送的mcpack2结构体描述,A模式使用
 -S 指定延迟发送时间,A、B模式使用
 -n 指定响应次数(-1 表示不退出),A、B模式使用
 -l 指定处理请求后是否断连接,A、B模式使用
 -u 指定是否为udp,A、B模式使用
 -b 指定一个逻辑xml,B模式使用
 -d 指定自定义so路径,C模式使用
 -a 指定自定义so名称,C模式使用
 -t 指定线程数,A、B、C模式使用
 -p 指定端口号,A、B、C模式使用

6 附录
6.1 关键字列表
 #randuint(a,b):返回从a到b之间的一个随机数
 #timenow():返回当前时间的秒数
 #md5(16,str):根据str生成md5
 #fromto(a,b):返回[a,b]的整数,随运行次数递增
 #randin(a,b,c,d):在abcd中随机抽一个数
 flowlen():计算后续部分的长度

6.2 内置类型
 int8_t uint8_t 
 int16_t uint16_t
 int32_t uint32_t
 int64_t uint64_t
 int 
 time_t
 long
 short
 char

(baiduqa,邮箱:qablog@baidu.com)

 
















本文转自百度技术51CTO博客,原文链接:http://blog.51cto.com/baidutech/744459如需转载请自行联系原作者

相关文章
|
JSON 数据格式
【虚幻引擎】DTWebSocketServer 蓝图创建WebSocket服务器插件使用说明
该插件用于创建和管理WebSocket服务器,支持通过蓝图创建服务器、监听端口并接收响应。主要功能包括:创建服务器、绑定各种回调函数(用户连接、断开、发送消息时触发)、关闭服务器、获取所有用户、获取用户数据、向用户发送消息及主动关闭用户连接。示例和下载链接在原文中提供。
196 2
|
6月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
存储 弹性计算 大数据
阿里云服务器怎么样?全访问解析云服务器ECS功能、租用、优缺点及使用说明
阿里云ECS是弹性计算服务,提供安全可靠的云服务器,包括多种实例规格如经济型、通用型、计算型等,适合不同场景。ECS支持VPC专有网络、快照与镜像、多种付费模式。用户可根据业务需求选择实例、存储类型和网络配置。阿里云服务器适用于Web应用、游戏、大数据和深度学习等场景,提供免费试用和不同优惠套餐。众多知名企业如新浪微博等信赖阿里云服务。更多信息可访问阿里云官方网站。
532 5
|
10月前
|
机器学习/深度学习 人工智能 弹性计算
阿里云GPU服务器全解析_GPU价格收费标准_GPU优势和使用说明
阿里云GPU云服务器提供强大的GPU算力,适用于深度学习、科学计算、图形可视化和视频处理等场景。作为亚太领先的云服务商,阿里云GPU云服务器具备高灵活性、易用性、容灾备份、安全性和成本效益,支持多种实例规格,满足不同业务需求。
2275 2
|
11月前
|
Java Linux
java读取linux服务器下某文档的内容
java读取linux服务器下某文档的内容
99 3
java读取linux服务器下某文档的内容
|
Ubuntu Linux 数据中心
阿里云服务器纯净版系统及系统版本参考与相关使用说明
在我们选购阿里云服务器的时候,操作系统有公共镜像、自定义镜像、共享镜像、云市场镜像、社区镜像可选,其中公共镜像为纯净版系统,这些系统皆已正版授权,旨在为ECS实例上的应用程序提供安全、稳定的运行环境。本文为大家汇总了阿里云服务器纯净版系统及最新的系统版本以及相关使用说明,以供大家了解和选择。
阿里云服务器纯净版系统及系统版本参考与相关使用说明
|
弹性计算 编解码 云计算
有奖评测!云服务器文档体验评测等你来
诚邀云服务器ECS用户参与文档体验评测!活动时间:8月14日至28日。完成15个场景任务并提供真实评分、改进建议及体验视频,即可获500元现金奖励;最佳建议另有100元奖金。任务需对比多云文档并按指引录制视频。详情及流程请见活动页面与钉群通知。名额有限,速来参加!
|
Web App开发 存储 C#
C# 10分钟入门基于WebOffice实现在线编辑文档,实时保存到服务器(所有office,兼容WPS)
C# 10分钟入门基于WebOffice实现在线编辑文档,实时保存到服务器(所有office,兼容WPS)
|
存储 机器学习/深度学习 人工智能
社区供稿 | Yuan2.0千亿大模型在通用服务器上的高效推理实现:以NF8260G7服务器为例
浪潮信息联合Intel在IPF大会上发布了可运行千亿参数大模型的AI通用服务器,首次实现了单机通用服务器,即可运行千亿参数大模型。并在发布现场演示了基于NF8260G7服务器进行yuan2.0-102B模型在代码编写、逻辑推理等高难度问题上的实时推理效果,引起了业界广泛的关注。本文将详细解读yuan2.0-102B模型在NF8260G7服务器上进行高效实时推理的原理和技术路径。
|
前端开发 Java 关系型数据库
【Java用法】使用Java导出word文档的解决方案(适用于从服务器上下载到本地电脑)
【Java用法】使用Java导出word文档的解决方案(适用于从服务器上下载到本地电脑)
1479 0

热门文章

最新文章