# QPerf **Repository Path**: scada/qperf ## Basic Information - **Project Name**: QPerf - **Description**: Qt框架开发的局域网网络性能测试工具 - **Primary Language**: C++ - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 35 - **Created**: 2021-04-04 - **Last Updated**: 2021-04-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # QPerf 如果项目帮助到你,请点个星星。 如果你想加入项目,请私信作者或留言。 如果你发现了项目的BUG,请提交`PR` 或 `Issue` 。 项目及文档持续完善中,欢迎加入。交流QQ群:972641491。 --- ## :fire: 介绍 QPerf是跨平台网络性能测试软件,采用Qt5框架开发。与其它同类工具不同,QPerf支持使用Udp或Tcp在极限情况下测量网络状况。 ### :construction: 应用场景 1. `网络丢包测试`,想测量网络中两台主机在特定发包速率下的丢包率,用`QPerf`; 2. `网络极限测试`,想测量网络中两台主机的tcp或udp发包的极限,用`QPerf`; 3. 无聊就想`试试`,用`QPerf`。 ### :alien: 引用的开源项目 * [QtNet](https://gitee.com/andwp/qt-socket) `这是一个基于Qt5的开源网络库,封装Udp、Tcp的基础通信。` * [QsLog](https://bitbucket.org/razvanpetru/qt-components/wiki/QsLog) `这是一个基于Qt开发的开源日志库,封装基本的日志操作。` ### :rocket:使用方法 ``` Usage: qperf [options] QPerf --- a tool for measure network status . Options: -?, -h, --help Displays this help.[显示帮助] -v, --version Displays version information.[版本] -p, --cport Command link port, .[命令链路使用端口] -a, --caddr
Command link address,
.[命令链路使用地址,客户端必填] -P, --dport Data link port.[数据链路使用端口,客户端必填,服务端不用填] -s, --server Run with server mode,default in client mode.[是否服务端,服务端选项,默认客户端。] -u, --udp Data link use udp. [数据链路是否使用UDP模式] -t, --timout Timeout (ms). [数据超时时间,默认1000(ms),服务端设置无效。] -r, --frequency Send packet frequency per second. [发送数据频率,服务端设置无效。] -o, --total Total packet send. [发送数据总数,服务端设置无效。] -S, --packSize Send perpacket size(in bytes). [发送数据包大小(字节)] -f, --fake Run progress in fake .[是否使用测试模式。调试使用。] ``` ### :card_file_box:编译说明 QPerf支持在Windows 和Linux 操作系统上编译。 #### :art: 命令行编译 ``` qmake.exe qperf.pro -spec win32-g++ "CONFIG+=release" && mingw32-make.exe qmake_all mingw32-make.exe -j8 ``` --- #### :art: 使用集成环境编译 `测试支持Qt5.12及以上的编译环境。 ` 1. 打开QtCreator,设置编译器; 2. 编译qtsocket项目; 3. 编译netperf项目; 4. 运行netperf项目。 --- #### :lock:例子 * :rocket: 创建服务端,监听本地5555端口。 ``` ./qperf -s -a 127.0.0.1 -p 5555 ``` * :rocket: 创建客户端端,连接服务端端,并以6666端口发送数据,数据按100包/秒的频率发送1000包,每包数据大小200字节。 ``` ./qperf -a 127.0.0.1 -p 5555 -P 6666 -r 100 -o 1000 -S 200 ``` ## :fire:软件架构 ### :apple: 类设计
图1 主要类图
![Image 主要类图](doc/主要类图.png) #### :wrench:主要类说明 ##### :hammer:BaseState 状态基类 网络性能测试工具的状态抽象。此类是应用设计模式-状态模式的一个变体,解决各状态之间的业务耦合,各状态类可组合使用。 ##### :hammer:StateFactory 状态类创建工厂 封装各个状态的实现类。包括:`InitServerState`、 `StartServerState`、`InitClientState`、`InitServerState`、`StopState`等的对象实例创建。 ##### :hammer:PointerFactory 远端节点类创建工厂 封装各个远端节点实现类。包括:`FakeServerPointer`、`FakeClientPointer`、`PFPointer`。 ##### :hammer:BasePointer 远端节点基类 表示对远端节点的业务封装,一个远端节点可能是真实存在的,也可能是虚拟的(`FakeClientPointer`、 `FakeServerPointer`) ##### :hammer:Context 上下文 封装类的调用关系。控制状态切换。依赖`BasePointer`、`BaseState`。使用`PointerFactory`、`StateFactory` 创建需要的实例。 ##### :hammer:BaseTunnel 隧道基类 对通信隧道的封装,通信隧道可能是`TcpServer`、`TcpClient`、`Udp`的任一种封装。 ##### :hammer:PFPointer 真实远端节点类 封装真实的远端节点的类,内部实现对实际远端测试的命令隧道、数据隧道的业务封装。 ### :fire:状态机设计
图2 服务端状态机设计
![Image 服务端状态机](doc/服务端状态图.png)
图3 客户端状态机设计
![Image 客户端状态机](doc/客户端状态图.png)
图4 服务端时序图
![Image 服务端时序图](doc/服务端时序图.png)
图5 客户端时序图
![Image 客户端时序图](doc/客户端时序图.png) ### :fire:目录结构 - qtsocket QtNet通信库项目文件; - include QtNet通信库头文件; - src QtNet通信库实现文件; - netperf 网络性能测试工具(进行中); - perfunittest 性能测试工具的单元测试; - doc 文档相关。 ### :wrench:编码规范 #### :triangular_flag_on_post:命名 - :pushpin: 文件名 所有源代码文件均使用全小写命名,源码文件的名称与文件中的类名称一致。 - :pushpin: 类命名 大写开头,遵从驼峰式命名法,使用英文名词对需要缩写的单词,不得超过三个连续的大写字母。 - :pushpin: 类方法命名 小写开头,遵从驼峰式命名法。 - :pushpin: 类成员命名 类成员使用`m_`开头,紧接着的单词以小写开头,并遵从驼峰式命名法。 - :pushpin: 属性命名 获取属性名称以对应的成员名称为准(去掉`m_`开头), 设置属性加入前置`set`,并接属性大写开头。 - :pushpin: 局部变量命名 局部变量以小写开头,遵从驼峰式命名法。 - :pushpin: 枚举命名 枚举中的成员以枚举类型的缩写开头。并与实际名称以`_`连接。 比如OptionType类型中的CmdPort。命名为Opt_CmdPort。 #### :triangular_flag_on_post:注释 注释主要有区块注释`/**/` 和行注释`//` ,应用于类、方法、成员等。 - :pencil2: 类注释 例子: ```cpp /** * @brief The CommandParser class * 解析命令参数。 */ ``` - :pencil2: 方法注释 正常情况下,所有的方法都需要注释,在方法为被重载的方法时,可不注释。注释例子: ```cpp /** * @brief cmdIPTuple 获取命令的IP五元组。 * @param dest 输出参数。 * @return 成功返回true。 */ ``` - :pencil2: 成员注释 例子: ```cpp int m_sampling; //数据采样率 int m_allowErrorCode; //允许数据包容错大小 QTime m_startTime; //启动时间 qint64 m_totalSampleCount; //读取到的总数据大小 ``` #### :triangular_flag_on_post:代码格式 - :pencil2: if 条件 ```cpp if(condition) { dosth.. } ``` - :pencil2: while 循环 ```cpp while(condition) { dosth... } ``` 或 ```cpp do{ dosth... }while(condtion) ``` #### :triangular_flag_on_post:文件编码 所有代码文件采用utf-8 带BOM头格式保存 #### :triangular_flag_on_post:其它规范 - :pencil2:类的代码行数限定 500行以内 - :pencil2:类方法代码行数限定 50行以内 - :pencil2:类的继承层次不超过3层 - :pencil2:`while` `if-else` `switch-case` 等嵌套层次不能超过3层