移植 iperf 网络性能测试工具到 Android-P
.
.
.
.
.
新开发板使用了 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的更多相关文章
- iperf——网络性能测试工具
一.前言 工作中遇到需要测试Linux服务器网卡占用率的场景,查阅资料后,发现iperf是一款合适的网络测速工具. 下面讲解一下如何使用iperf做网络性能测试. 二.基础知识 先补充一些基础知识: ...
- 网络性能测试工具iperf详细使用图文教程
Iperf是一个网络性能测试工具.Iperf可以测试TCP和UDP带宽质量.Iperf可以测量最大TCP带宽,具有多种参数和UDP特性. Iperf可以报告带宽,延迟抖动和数据包丢失.利用Iper ...
- 网络性能测试工具iperf详细使用图文教程【转载】
原文:http://blog.163.com/hlz_2599/blog/static/142378474201341341339314/ 参考:http://man.linuxde.net/iper ...
- Iperf是一个网络性能测试工具
http://blog.163.com/hlz_2599/blog/static/142378474201341341339314/ Iperf是一个网络性能测试工具.Iperf可以测试TCP和UDP ...
- 网络性能测试工具iperf详细使用图文教程(转)
Iperf是一个网络性能测试工具.Iperf可以测试TCP和UDP带宽质量.Iperf可以测量最大TCP带宽,具有多种参数和UDP特性.Iperf可以报告带宽,延迟抖动和数据包丢失.利用Iperf这一 ...
- 【Linux】网络性能测试工具iperf详细使用图文教程【转】
参考链接:https://www.cnblogs.com/yingsong/p/5682080.html Iperf是一个网络性能测试工具.Iperf可以测试TCP和UDP带宽质量. Iperf可以测 ...
- 网络性能测试工具Iperf/Jperf解读
Iperf 是一个网络性能测试工具.Iperf 可以测试TCP 和UDP 带宽质量.Iperf 可以测量最大TCP 带宽,具有多种参数和UDP 特性. Iperf 可以报告带宽,延时抖动和数据包丢失. ...
- 网络性能测试工具-Iperf
一.简单介绍 Iperf是一个网络性能测试工具,Iperf可以测试TCP和UDP带宽质量,Iperf可以测量最大TCP带宽,具有多种参数和UDP特性.Iperf可以报告带宽,延迟抖动和数据包丢失.利用 ...
- iperf点对点网络性能测试工具
什么是Iperf?Iperf 是一个网络性能测试工具.Iperf可以测试TCP和UDP带宽质量.Iperf可以测量最大TCP带宽,具有多种参数和UDP特性.Iperf可以报告带宽,延迟抖动和数据包丢失 ...
随机推荐
- android 职业 转行
不知道多少人和我一样.学安卓安卓工作.成了一件很烦躁的事情.甚至迷茫. 起初学安卓,是因为安卓流行,所以有兴趣,想要学.那个时候想做一个应用,想对安卓手机有个了解,比如获取手机短信.没有太在意工 ...
- C - Rikka with Badminton --- HDU 6425 快速幂加组合数学
---恢复内容开始--- 题目链接: https://vjudge.net/problem/1812693/origin 这题的mod运算很恶心,真的... 本题有正反两个思路,一个是正面求解其不能成 ...
- 给有C或C++基础的Python入门 :Python Crash Course 4 操作列表 4.1--4.3
操作列表,也就是遍历列表.本章我们要学的就是如何遍历列表. 4.1--4.2 遍历列表 遍历列表,用for循环. 不同于C++或者C语言的for循环,Python的for循环更容易让人理解. 看一个例 ...
- 2006 ACM 求奇数的和
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2006 注意 sum=1,写在while 不然每次结果会累积 #include <stdio.h> ...
- LeetCode(485. 最大连续1的个数)
问题描述 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: ...
- [P2921][USACO08DEC]在农场万圣节Trick or Treat on the Farm (记忆化搜索/DP?,Tarjan?)
第一看还以为是水题 随便打了一个bfs只有40分…… 然后开始颓废 #include<bits/stdc++.h> #define N 100005 using namespace std ...
- 使用log
1:下载和安装log4j log4j的官方站点是http://logging.apache.org/log4j/登录此网站即可下载. http://logging.apache.org/log4j/2 ...
- 【组合数】[NOIP2011]选择客栈[c++]
题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...
- 怎样在 Ubuntu 16.04 强制 APT 包管理器使用 IPv4 | Linux 中国
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/F8qG7f9YD02Pe/article/details/82879401 https://mmbi ...
- commit 冲突
git status or repo sync . 时看到如下的提示: error: packages/apps/app/: branch alpha is published (but not me ...