.

.

.

.

.

新开发板使用了 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. Myeclipse10.0版下载

    链接:http://pan.baidu.com/s/1kVl1kSf 密码:p6yr 主界面框图

  2. 最近在搞gitlab发现2个不错的开发流程分享一下

    一个不错的gitlab开发流程 http://blog.51cto.com/sgk2011/1925922 不错的git开发流程 https://www.cnblogs.com/coderzl/p/7 ...

  3. FTL常用标签及语法

    判断对象是否存在,若成立说明存在 <#if blockObjList ??></#if> <#if blockObjList ??>  <#else>  ...

  4. 【DWM1000】 code 解密5一ACHOR 第一次回家Main 函数

    instance_run(); if((instance_data[0].monitor == 1) && ((portGetTickCnt() - instance_data[0]. ...

  5. 免花生壳 TCP测试 DTU测试 GPRS测试TCP服务器

    通常在学习GPRS或者DTU的时候,往往没有自己的服务器,很多时候我们只能用这个模块打个电话发个短信,但是随着移动互联的兴起,各行各业大家都开始弄移动接入.为了这个需求,这里提供TCP移动接入. 工作 ...

  6. JS字符串截取(获取指定字符后面的所有字符内容)

    function getCaption(obj){     var index=obj.lastIndexOf("\-");     obj=obj.substring(index ...

  7. php 创建返回结果配置文件 实例

    <?phpclass validateReturn{    //get return msg    function caseReturn($aRerurn)    {        $strM ...

  8. 使用scrapy爬取百度股票

    1.spiders文件夹下的爬虫文件 # -*- coding: utf-8 -*- import scrapy import re import random from scrapy.http.re ...

  9. 用canvas整个打飞机游戏

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 之前在当耐特的DEMO里看到个打飞机的游戏,然后就把他的图片和音频扒了了下来....自己凭着玩的心情重新写了一个.仅供娱乐哈......我 ...

  10. BZOJ4083 : [Wf2014]Wire Crossing

    WF2014完结撒花~ 首先求出所有线段之间的交点,并在交点之间连边,得到一个平面图. 这个平面图不一定连通,故首先添加辅助线使其连通. 然后求出所有域,在相邻域之间连一条代价为$1$的边. 对起点和 ...