.

.

.

.

.

新开发板使用了 Android-P 的方案,WiFi 刚刚调通,为了测试 WiFi 稳定性,需要使用 iperf 工具。但 Android 并没有提供这个工具,只能自己移植一份了。

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

解压后删除 Makefile 等不相关的文件,并建立 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 include $(BUILD_EXECUTABLE) # Host executable.
# ========================================================= include $(CLEAR_VARS) LOCAL_MODULE := iperf_x86 LOCAL_C_INCLUDES := $(LOCAL_PATH)/src LOCAL_SRC_FILES := $(call all-c-files-under, src) LOCAL_CFLAGS := -Wno-error -DIPERF_HOST=1 LOCAL_LDFLAGS := -static LOCAL_MODULE_TAGS := debug include $(BUILD_HOST_EXECUTABLE) include $(call first-makefiles-under,$(LOCAL_PATH))

接下来打开 src/flowlabel.h 文件,在 struct in6_flowlabel_req 结构体的定义外面加上条件编译指令,修改后如下所示:

 // It's defined in bionic/libc/kernel/uapi/linux/in6.h
#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

IPERF_HOST 这个宏是我们在 Android.mk 里面定义的,因为编译 arm 版 iperf 时,编译参数中会指定 boinic 的库,这个宏会出现重定义的情况。但编译 x86 版本的 iperf 时,不会链接这些库,所以这个结构体必须由本程序来定义。

接下来打开 src/iperf_api.c 文件,找到 iperf_new_stream(struct iperf_test *, int) 函数,里面有这样的变量定义:

char template[] = "/tmp/iperf3.XXXXXX";

由于 Android 没有 /tmp 目录,所以运行的时候会报错,所以我们把这个目录修改为 /data 目录,修改后的代码如下:

 #if IPERF_HOST
char template[] = "/tmp/iperf3.XXXXXX";
#else
char template[] = "/data/iperf3.XXXXXX";
#endif

接下来把 src/config.h.in 重命名为 src/config.h:

>$ mv src/config.h.in src/config.h

最后一步,删掉 src/t_uuid.c、src/t_timer.c 和 src/t_units.c 三个文件,否则会出现 main() 函数冲突的错误。
当然,如果在 Android.mk 中通过 LOCAL_SRC_FILES 变量来指定每个要编译的源文件,再从中排除掉这三个文件也是可以的。不过这样做写的内容比较罗嗦,干脆把它们仨删掉,直接用 LOCAL_SRC_FILES := $(call all-c-files-under, src) 自动包含 src 目录下所有的 .c 文件。

>$ rm src/t_uuid.c src/t_timer.c src/t_units.c 

mm 编译后会生成两个文件,分别是 arm 版和 x86 版的可执行程序。

>$ mm
Install: out/host/linux-x86/bin/iperf_x86
Install: out/target/product/msm8909go/system/xbin/iperf

记录一个遇到的坑:

一开始编译的时候报这样一个错误:

error: unused parameter 'argc' [-Werror,-Wunused-parameter]

main() 函数的 argc 参数没有使用,一般来说报个警告就可以了,为什么直接报成错误了呢?
后来仔细研究了生成的编译命令发现里面带了 -Werror 参数,这个参数会将 warning 转换为 error,强制要求程序编译期间不能出现警告。
为了解决这个问题,只需在 Android.mk 中指定 -Wno-error 参数即可:

LOCAL_CFLAGS := -Wno-error

iperf 工具的使用很简单,网上有很多教程,这里只给出几个示例。

启动服务端:

># iperf -s

-s 参数表示以服务端形式启动。
网上有些文章说如果使用 UDP 协议需要,指定 -u 参数。但经实测后发现,我使用的这个版本,服务端无需指定 -u 就可以支持 TCP 和 UDP 两种协议。

启动客户端:

./iperf_x86 -c 172.16.61.90 -u -t  -b 16M

-c 表示启动客户端,后面跟服务端的 IP 地址。
-u 表示使用 UDP 协议,不加此参数使用 TCP 协议。
-t 表示持续执行多少秒的测试,默认10秒。
-b 表示发送的数据包大小,TCP 默认使用最大带宽,UDP 默认1Mbits。

TCP 协议适合用来测试最大带宽,UDP 协议适合用来测试丢包率、网络抖动等情况。

移植 iperf 网络性能测试工具到 Android-P的更多相关文章

  1. iperf——网络性能测试工具

    一.前言 工作中遇到需要测试Linux服务器网卡占用率的场景,查阅资料后,发现iperf是一款合适的网络测速工具. 下面讲解一下如何使用iperf做网络性能测试. 二.基础知识 先补充一些基础知识: ...

  2. 网络性能测试工具iperf详细使用图文教程

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

  3. 网络性能测试工具iperf详细使用图文教程【转载】

    原文:http://blog.163.com/hlz_2599/blog/static/142378474201341341339314/ 参考:http://man.linuxde.net/iper ...

  4. Iperf是一个网络性能测试工具

    http://blog.163.com/hlz_2599/blog/static/142378474201341341339314/ Iperf是一个网络性能测试工具.Iperf可以测试TCP和UDP ...

  5. 网络性能测试工具iperf详细使用图文教程(转)

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

  6. 【Linux】网络性能测试工具iperf详细使用图文教程【转】

    参考链接:https://www.cnblogs.com/yingsong/p/5682080.html Iperf是一个网络性能测试工具.Iperf可以测试TCP和UDP带宽质量. Iperf可以测 ...

  7. 网络性能测试工具Iperf/Jperf解读

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

  8. 网络性能测试工具-Iperf

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

  9. iperf点对点网络性能测试工具

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

随机推荐

  1. Java性能调优zz

    写Java也有n年了,现在还是有不少的坏的代码习惯,也通过学习别人的代码学到了不少好的习惯.这篇文章主要是整理的资料.留给自己做个警戒,提示以后写代码的时候注意!在文章的后面,会提供整理的原材料下载. ...

  2. C#选择文件、选择文件夹、打开文件

    1.选择文件用OpenDialog OpenFileDialog dialog = new OpenFileDialog(); dialog.Multiselect = true;//该值确定是否可以 ...

  3. Some Conclusions.

    目录 DP 四边形不等式 数论 & 数学 数据结构 树链剖分 左偏树的性质及\(O(n)\)的构造 图论 树 二分图 竞赛图 平面图 双连通分量 字符串 后缀自动机 复杂度分析 没什么好写的. ...

  4. IDEA安装使用Lombok插件

    项目中经常使用bean,entity等类,绝大部分数据类类中都需要get.set.toString.equals和hashCode方法,虽然IDEA开发环境下都有自动生成的快捷方式,但自动生成这些代码 ...

  5. Java笔记(五)泛型

    泛型 一.基本概念和原理 泛型将接口的概念进一步延申,“泛型”的字面意思是广泛的类型. 类.接口和方法都可以应用于非常广泛的类型,代码与它们能够操作 的数据类型不再绑定到一起,同一套代码可以应用到多种 ...

  6. MySql基础笔记(二)Mysql语句优化---索引

    Mysql语句优化--索引 一.开始优化前的准备 一)explain语句 当MySql要执行一个查询语句的时候,它首先会对语句进行语法检查,然后生成一个QEP(Query Execution Plan ...

  7. C++程序设计方法4:成员函数模板

    成员函数的模板: 普通类的成员函数,也可以定义为函数模板,如: class normal_class { public: int value; template<typename T> v ...

  8. curl: (25) Failed FTP upload: 550 解决方案

    ftp的地址一定要以”/”结束.比如:ftp://127.0.0.1/01Dev/

  9. Flask对象配置

    Flask的配置就是在 app.config 中添加一个键值对,但是你存进去的键必须是config中应该存在的,如果不再存在的话,它会默认无用,就这么放着 config中有用的key { 'DEBUG ...

  10. 用Java代码列出一个目录下所有的文件

    1.File类 File类在java.io.File包中,所以要导入这个包. File类中用到的方法: boolean isDirectory()       测试此抽象路径名表示的文件是否是个目录 ...