iperf是什么

Iperf 是一个网络性能测试工具,是跨平台的,支持Window,linux,android平台的运行和测试,可以为任何网络生成标准化的性能测量。

Iperf 可以测试最大 TCP 和 UDP 带宽性能,具有多种参数和UDP特性,可以根据需要调整,可以报告带宽、延迟抖动和数据包丢失。

源代下载地址:https://storage.googleapis.com/google-code-archive-source/v2/code.google.com/iperf/source-archive.zip

下载可能会很慢,不行去 https://iperf.fr/iperf-download.php 下载 linux 版本源码

移植步骤

1、解压 iperf 源码,放置到android源码目录下,这里以 system/ 目录为例,你也可以放到 package/app 或者其它目录

2、删除源码目录下的 Makefile.am 和 Makefile.in 文件 以及 src 目录下 Makefile.am 、Makefile.in、Makefile.old

3、新增 Android.mk, 加入如下配置

LOCAL_PATH := $(call my-dir)
# Device executable.
# =========================================================
include $(CLEAR_VARS)
LOCAL_MODULE := iperf
LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/src
LOCAL_SRC_FILES := $(call all-c-files-under, src)
LOCAL_CFLAGS := -Wno-error -DIPERF_HOST=0
LOCAL_MODULE_TAGS := debug
LOCAL_FORCE_STATIC_EXECUTABLE := true
# LOCAL_LDLIBS += -llog
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
LOCAL_STATIC_LIBRARIES := libutils liblog
include $(BUILD_EXECUTABLE)

遇到的坑

1、config.h 文件找不到,源码中的文件是 config.h.in, 去掉后缀 .in 即可

system/iperf/src/iperf_util.c:29:10: fatal error: 'config.h' file not found
#include "config.h"^~~~~~~~~~
1 error generated.
[ 42% 11/26] target  C: iperf <= system/iperf/src/iperf_tcp.c

2、结构体 in6_flowlabel_req 重复定义,解决办法 flowlabel.h 中结构体外增加条件编译控制

In file included from system/iperf/src/iperf_tcp.c:29:
system/iperf/src/flowlabel.h:22:8: error: redefinition of 'in6_flowlabel_req'
struct in6_flowlabel_req^
bionic/libc/kernel/uapi/linux/in6.h:55:8: note: previous definition is here
struct in6_flowlabel_req {^
1 error generated.*/
#if IPERF_HOST
struct in6_flowlabel_req
{struct in6_addr flr_dst;__u32   flr_label;__u8    flr_action;__u8    flr_share;__u16   flr_flags;__u16   flr_expires;__u16   flr_linger;__u32   __flr_pad;/* Options in format of IPV6_PKTOPTIONS */
};
#endif

3、main 函数冲突错误,删除 src/t_uuid.c、src/t_timer.c 和 src/t_units.c 三个文件

prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/aarch64-linux-android/bin/ld.gold: error: out/target/product/k37tv1_64_bsp/obj/EXECUTABLES/iperf_intermediates/src/t_timer.o: multiple definition of 'main'
prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/aarch64-linux-android/bin/ld.gold: out/target/product/k37tv1_64_bsp/obj/EXECUTABLES/iperf_intermediates/src/main.o: previous definition here
prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/aarch64-linux-android/bin/ld.gold: error: out/target/product/k37tv1_64_bsp/obj/EXECUTABLES/iperf_intermediates/src/t_units.o: multiple definition of 'main'
prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/aarch64-linux-android/bin/ld.gold: out/target/product/k37tv1_64_bsp/obj/EXECUTABLES/iperf_intermediates/src/main.o: previous definition here
prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/aarch64-linux-android/bin/ld.gold: error: out/target/product/k37tv1_64_bsp/obj/EXECUTABLES/iperf_intermediates/src/t_uuid.o: multiple definition of 'main'
prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/aarch64-linux-android/bin/ld.gold: out/target/product/k37tv1_64_bsp/obj/EXECUTABLES/iperf_intermediates/src/main.o: previous definition here
clang.real: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
16:16:14 ninja failed with: exit status 1

4、然后再编译,你就阔仪得到 iperf 文件了,输出路径位于 system/xbin/ 下

[ 83% 5/6] target Strip (mini debug info): iperf (out/target/product/k37tv1_64_bsp/obj/EXECUTABLES/iperf_intermediates/iperf)
prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-nm: out/target/product/k37tv1_64_bsp/symbols/system/xbin/iperf: no symbols
[100% 6/6] Install: out/target/product/k37tv1_64_bsp/system/xbin/iperf#### build completed successfully (44 seconds) ####

5、把 system/xbin/iperf文件 push 到设备中,adb shell 执行命令

先给 iperf 赋权, chmod 777 system/xbin/iperf,然后开启服务端,再执行

iperf -c 192.168.40.37 -p 5201 -t 10

Connecting to host 192.168.40.37, port 5201
iperf3: error - unable to create a new stream: No such file or directory

提示错误,这是因为 iperf 执行时需要指定缓存目录,源码中用的是 char template[] = “/tmp/iperf3.XXXXXX”;

O 以上已经没有 tmp 目录了,将其修改为 char template[] = “/data/local/tmp/iperf3.XXXXXX”;

重新编译push

这样就能正常使用 iperf 工具了

Connecting to host 192.168.40.37, port 5201
[  4] local 192.168.3.4 port 34986 connected to 192.168.40.37 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.07   sec  2.12 MBytes  16.6 Mbits/sec   73   37.2 KBytes
[  4]   1.07-2.11   sec  1.00 MBytes  8.11 Mbits/sec    0   44.1 KBytes
[  4]   2.11-3.17   sec  1.00 MBytes  7.87 Mbits/sec    1   40.0 KBytes
[  4]   3.17-4.10   sec  1.25 MBytes  11.3 Mbits/sec    0   46.9 KBytes
[  4]   4.10-5.00   sec  1.88 MBytes  17.5 Mbits/sec    0   52.4 KBytes
[  4]   5.00-6.00   sec  1.62 MBytes  13.6 Mbits/sec    5   45.5 KBytes
[  4]   6.00-7.10   sec  1.75 MBytes  13.4 Mbits/sec    2   41.4 KBytes
[  4]   7.10-8.20   sec  1.12 MBytes  8.58 Mbits/sec    0   46.9 KBytes
[  4]   8.20-9.20   sec   512 KBytes  4.19 Mbits/sec    0   48.3 KBytes
[  4]   9.20-10.10  sec   640 KBytes  5.82 Mbits/sec    3   35.9 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.10  sec  12.9 MBytes  10.7 Mbits/sec   84             sender
[  4]   0.00-10.10  sec  12.7 MBytes  10.5 Mbits/sec                  receiveriperf Done.

app 中调用 iperf

每次都需要在 adb shell 下调用测速,其实在 java 代码中也能,通过 Runtime.getRuntime().exec() 执行 iperf 指令

successMsg: Connecting to host 192.168.40.37, port 5201

errorMsg: iperf3: error - unable to create a new stream: Permission denied

在 app 执行时又返回 unable to create a new stream 错误,看来 char template[] 路径还得修改,试了好几个目录后,

最终指定到 sdcard/下解决了问题, char template[] = “/sdcard/iperf3.XXXXXX”;

String cmds = "iperf -c  192.168.40.37 -p 5201 -t 10";CommandResult result = execCmd(cmds, false, true);String fullResult = result.toString();public static CommandResult execCmd(final String[] commands,final boolean isRooted,final boolean isNeedResultMsg) {int result = -1;if (commands == null || commands.length == 0) {return new CommandResult(result, "", "");}Process process = null;BufferedReader successResult = null;BufferedReader errorResult = null;StringBuilder successMsg = null;StringBuilder errorMsg = null;DataOutputStream os = null;try {process = Runtime.getRuntime().exec(isRooted ? "su" : "sh");os = new DataOutputStream(process.getOutputStream());for (String command : commands) {if (command == null) {continue;}os.write(command.getBytes());os.writeBytes(LINE_SEP);os.flush();}os.writeBytes("exit" + LINE_SEP);os.flush();result = process.waitFor();if (isNeedResultMsg) {successMsg = new StringBuilder();errorMsg = new StringBuilder();successResult = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream(), "UTF-8"));String line;if ((line = successResult.readLine()) != null) {successMsg.append(line);while ((line = successResult.readLine()) != null) {successMsg.append(LINE_SEP).append(line);}}if ((line = errorResult.readLine()) != null) {errorMsg.append(line);while ((line = errorResult.readLine()) != null) {errorMsg.append(LINE_SEP).append(line);}}}} catch (Exception e) {e.printStackTrace();} finally {try {if (os != null) {os.close();}} catch (IOException e) {e.printStackTrace();}try {if (successResult != null) {successResult.close();}} catch (IOException e) {e.printStackTrace();}try {if (errorResult != null) {errorResult.close();}} catch (IOException e) {e.printStackTrace();}if (process != null) {process.destroy();}}return new CommandResult(result,successMsg == null ? "" : successMsg.toString(),errorMsg == null ? "" : errorMsg.toString());}

下载我编译好的 iperf

MTK-Android-CZ-Code/iperf/

参考文章

https://www.sdnlab.com/2961.html

https://www.cnblogs.com/0xcafebabe/p/10685938.html

https://blog.csdn.net/Sunxiaolin2016/article/details/100112339

Android O/P/Q 版本移植iperf网络性能测试工具相关推荐

  1. iperf —— 网络性能测试工具,编译、安装、使用笔记

    文章目录 1. 背景 2. 编译 2.1 下载 2.2 编译 3. 安装 4. 使用 5. 参考 1. 背景 为了测试嵌入式SOC的网络性能,需要一个能够测试带宽.抖动.丢包率等参数的工具,在linu ...

  2. Linux命令 iperf - 网络性能测试工具

    iperf 网络性能测试工具 下载地址: Google Code Archive - Long-term storage for Google Code Project Hosting.https:/ ...

  3. Linux iperf 网络性能测试工具

    Linux iperf 是一个网络性能测试工具.iperf可以测试最大TCP和UDP带宽性能.iperf具有多种参数和UDP特性,可以根据需要调整.iperf可以报告带宽,延迟抖动和数据包丢失.进行测 ...

  4. iperf测试软件windows,windows版iperf网络性能测试工具

    iperf这玩意不用的时候丢在那里一年半载都难得启动一次,用起来的时候还是很能说明问题的.虽然网上有很多说明文档,不过都是介绍参数和命令格式,自己也写一点总结一下常用的情况. 服务器端配置: 从cmd ...

  5. tcp连接服务器性能测试,TCPIP网络性能测试工具 - Iperf.pdf

    TCPIP网络性能测试工具 - Iperf.pdf TCP/IP 网络性能测试工具 - Iperf TCP/IP网络性能测试工具 - Iperf 1 简介 Iperf 是一个 TCP/IP 和 UDP ...

  6. 网络性能测试工具iperf的使用与参数解析

    介绍   网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保证网络性能的基础,但是由于网络设计不合理.网络存在安全漏洞等原因,都会导致网络带宽利用率不高.要找到网络带宽利用率不高的原因, ...

  7. 网络性能测试工具Iperf上手指南

    Iperf是一个网络性能测试工具.可以测试TCP和UDP带宽质量,可以测量最大TCP带宽,具有多种参数和UDP特性,可以报告带宽,延迟抖动和数据包丢失.Iperf在linux和windows平台均有二 ...

  8. Linux如何安装iperf软件,Linux 下网络性能测试工具 iperf 的安装和使用

    很久没写文章,iperf 也一直有用,感受不错就记录一下html 说明: OS :CentOS 6.4 x86_64 Server: 192.168.100.55 Client: 192.168.10 ...

  9. iperf java_网络性能测试工具Iperf/Jperf

    Iperf 是一个网络性能测试工具.Iperf 可以测试TCP 和UDP 带宽质量.Iperf 可以测量最大TCP 带宽,具有多种参数和UDP 特性. Iperf 可以报告带宽,延时抖动和数据包丢失. ...

最新文章

  1. memcached(九)--LRU
  2. ./configure: error: the HTTP gzip module requires the zlib library.
  3. ConcurrentHashMap源码解读,java大厂面试攻略
  4. Mongo 用户创建及权限管理
  5. CRM【第三篇】: crm业务
  6. 使用XLinq.XElement读取带Namespace(命名空间)的XML
  7. 日报管理系统_设备维护管理系统的自动化报告功能
  8. 金万维异速联服务器重装,金万维异速联客户端常见错误提示及解决办法
  9. 如何检查您的 Android 设备是否支持 Widevine DRM
  10. 学习笔记(12):Google开发专家带你学 AI:入门到实战(Keras/Tensorflow)(附源码)-深度学习“四件套”:数据、模型、损失函数与优化器
  11. 变速齿轮”再研究-----(转帖)
  12. 微信小程序毕业设计选题
  13. react中prop-types的使用
  14. 顺丰快递单号要怎么快速查询物流并导出信息
  15. HTML+CSS学习笔记(篇幅较大)
  16. [张雨生][张雨生典藏合集22CD][APE/整轨/7.56 GB][旋风/快传]
  17. 5个超实用技巧:用trello提高scrum项目管理效率
  18. 网口灯电路——反相器
  19. 新浪微博密码加密分析
  20. 【c语言】结构体详解 | 结构体数组/指针

热门文章

  1. java里怎么给excel加框线,使用Jacob操作word 添加表格时 如何给表格添加边框线
  2. 讯飞语音包实现Android语音合成
  3. 安卓 11 非网络以太网切换动态和静态IP无法连接问题
  4. 趣图:沙雕用户的日常
  5. 离散数学复习--集合的势证明
  6. 国产32核服务器CPU验证成功!100%自主指令架构,单机最多可支持四路128核,来自龙芯中科...
  7. html复习第七天 京东首页布局完成
  8. Android自定义一个播放器控件
  9. 自定义控件解决android中TextView中英文换行问题
  10. 网络编程中的基本概念