iperf工具移植到Android9.0(转载)

声明: 转载自https://www.cnblogs.com/0xcafebabe/p/10685938.html

在此仅昨验证后的记录。

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

 

解压后删除 Makefile 等不相关的文件,并建立 Android.mk,内容如下:

 

复制代码

 1 LOCAL_PATH := $(call my-dir)

 2 

 3 # Device executable.

 4 # =========================================================

 5 

 6 include $(CLEAR_VARS)

 7 

 8 LOCAL_MODULE := iperf

 9 

10 LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)

11 

12 LOCAL_C_INCLUDES := $(LOCAL_PATH)/src

13 

14 LOCAL_SRC_FILES := $(call all-c-files-under, src)

15 

16 LOCAL_CFLAGS := -Wno-error -DIPERF_HOST=0

17 

18 LOCAL_MODULE_TAGS := debug

19 

20 LOCAL_FORCE_STATIC_EXECUTABLE := true

21 

22 include $(BUILD_EXECUTABLE)

23 

24 

25 # Host executable.

26 # =========================================================

27 

28 include $(CLEAR_VARS)

29 

30 LOCAL_MODULE := iperf_x86

31 

32 LOCAL_C_INCLUDES := $(LOCAL_PATH)/src

33 

34 LOCAL_SRC_FILES := $(call all-c-files-under, src)

35 

36 LOCAL_CFLAGS := -Wno-error -DIPERF_HOST=1

37 

38 LOCAL_LDFLAGS := -static

39 

40 LOCAL_MODULE_TAGS := debug

41 

42 include $(BUILD_HOST_EXECUTABLE)

43 

44 

45 include $(call first-makefiles-under,$(LOCAL_PATH))

复制代码

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

 

复制代码

 1 // It's defined in bionic/libc/kernel/uapi/linux/in6.h

 2 #if IPERF_HOST

 3 struct in6_flowlabel_req

 4 {

 5     struct in6_addr flr_dst;

 6     __u32   flr_label;

 7     __u8    flr_action;

 8     __u8    flr_share;

 9     __u16   flr_flags;

10     __u16   flr_expires;

11     __u16   flr_linger;

12     __u32   __flr_pad;

13     /* Options in format of IPV6_PKTOPTIONS */

14 };

15 #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 目录,修改后的代码如下:

 

1 #if IPERF_HOST

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

3 #else

4     char template[] = "/data/iperf3.XXXXXX";

5 #endif

 

ps: 不知是否平台差异,测试data目录不行,我自己用/sdcard/iperf3.xxxxxx测试ok

 

接下来把 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 600 -b 16M

-c 表示启动客户端,后面跟服务端的 IP 地址。

-u 表示使用 UDP 协议,不加此参数使用 TCP 协议。

-t 表示持续执行多少秒的测试,默认10秒。

-b 表示发送的数据包大小,TCP 默认使用最大带宽,UDP 默认1Mbits。

 

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

转载于:https://www.cnblogs.com/mengdao/p/11338766.html

资源里包括windows的iperf.exe、android系统安装的iperf.apk和iperf使用说明参数等内容。 Iperf是一个网络性能测试工具。可以测试TCP和UDP带宽质量,可以测量最大TCP带宽,具有多种参数和UDP特性,可以报告带宽,延迟抖动和数据包丢失。 Iperf使用方法与参数说明 参数说明 -s 以server模式启动,eg:iperf -s -c host以client模式启动,host是server端地址,eg:iperf -c 222.35.11.23 通用参数 -f [kmKM] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告,默认以Mbits为单位,eg:iperf -c 222.35.11.23 -f K -i sec 以秒为单位显示报告间隔,eg:iperf -c 222.35.11.23 -i 2 -l 缓冲区大小,默认是8KB,eg:iperf -c 222.35.11.23 -l 16 -m 显示tcp最大mtu值 -o 将报告和错误信息输出到文件eg:iperf -c 222.35.11.23 -o ciperflog.txt -p 指定服务器端使用的端口或客户端所连接的端口eg:iperf -s -p 9999;iperf -c 222.35.11.23 -p 9999 -u 使用udp协议 -w 指定TCP窗口大小,默认是8KB -B 绑定一个主机地址或接口(当主机有多个地址或接口时使用该参数) -C 兼容旧版本(当server端和client端版本不一样时使用) -M 设定TCP数据包的最大mtu值 -N 设定TCP不延时 -V 传输ipv6数据包 server专用参数 -D 以服务方式运行iperf,eg:iperf -s -D -R 停止iperf服务,针对-D,eg:iperf -s -R client端专用参数 -d 同时进行双向传输测试 -n 指定传输的字节数,eg:iperf -c 222.35.11.23 -n 100000 -r 单独进行双向传输测试 -t 测试时间,默认10秒,eg:iperf -c 222.35.11.23 -t 5 -F 指定需要传输的文件 -T 指定ttl值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值