第十八节 使用JPerf 工具测试网速

文章介绍了iPerf和JPerf这两个网络测速工具,用于测试TCP带宽、延迟和丢包情况。JPerf作为iPerf的图形化界面,简化了命令行操作。文章通过实例演示了如何使用JPerf测试开发板的接收和发送速度,比较了NETCONNAPI和SocketAPI的效率。最后,讨论了如何优化LwIP网络传输速度,包括调整内存堆大小、TCP缓冲区配置等。

iPerf 与JPerf

在讲解网络测速之前,我们先来了解一下测速的工具:iPerf 是一个跨平台的网络性能测试工具,它支持Win/Linux/Mac/Android/iOS 等平台,iPerf 可以测试TCP 和UDP(我们一般不对UDP 进行测速)带宽质量,iPerf 可以测量最大TCP 带宽,可以具有多种参数进行测试,同时iPerf 还可以报告带宽,延迟抖动和数据包丢失的情况,我们可以利用iPerf 的这些特性来测试一些网络设备如路由器,防火墙,交换机等的性能。

虽然iPerf 很好用,但是它却是命令行格式的软件,对使用测试的人员并不友好,使用者需要记下他繁琐的命令,不过它还有一个图形界面程序叫做JPerf,使用JPerf 程序能简化了复杂命令行参数的构造,而且它还保存测试结果,并且将测试结果实时图形化出来,更加一目了然,当然,JPerf 也肯定拥有iPerf 的所有功能。

测试网络速度

获取JPerf 网络测速工具

在测速之前,我们需要得到网络测速工具,在我们的论坛上有这个工具,然后,我们直接下载即可:http://www.firebbs.cn/forum.php?mod=viewthread&tid=26274&fromuid=37393。

下载后解压,双击jperf.bat 运行,稍等一会就出现JPerf 的界面,具体见图。

在这里插入图片描述

图JPerf 界面

我们来讲解一下这个界面的一些内容:

  • 图(1):客户端设置,电脑作为客户端,连接到服务器中(即我们的开发板作为服务器),服
    务器地址需要填写正确,端口号默认是5001,并发流默认是1 个。
  • 图(2):服务器设置,电脑作为服务器,我们的开发板作为客户端,client limit 选项表示仅允许指定客户端连接,Num Connections 指定最大允许连接的数量,为0 不限制。
  • 图(3):开始和停止JPerf 的运行。
  • 图(4):兼容旧版本(当server 端和client 端版本不一样时使用),默认不勾选,Transmit 设置测试模式,我们一般指定发送的时间,以秒为单位,当然也可以指定发送的数据大小,以字节为单位。
  • 图(5):如果勾选Dual 表示同时进行双向传输测试,如果勾选Trade 表示单独进行双向传输测试,默认不勾选。
  • 图(6):指定需要传输的文件以及显示最大TCP 报文段。
  • 图(7):传输层设置,我们一般用来测试TCP 连接的速度,Buffer Length 选项用于设置缓冲区大小,TCP Window Size 用于指定TCP 窗口大小,Max Segment Size 用于设定最大MTU 值,TCP No Delay 用于设定TCP 不延时。
  • 图(8):网速显示窗口,以折线图的形式显示出来。
  • 图(9):网速相关数据输出窗口,以文本的形式。

测试开发板接收速度(NETCONN API)

首先,我们肯定需在开发板上开发程序的,那么我们就单独创建一个iPerf 测速线程,在开发板上运行,开发板作为客户端,不断监听客户端(JPerf 上位机)的连接。

代码实现部分:我们首先拷贝一个移植好的工程,并且在工程中添加两个文件,分别为ipref.c 和ipref.h,然后在ipref.c 文件下添加代码清单 中的代码,其实这个代码跟TCP 服务器实验的代码都是差不多的,只不过接收到数据不进行处理而已,在ipref.h 文件下添加代码清单 中的代码。

代码清单 ipref.c 文件内容

/* FreeRTOS 头文件*/
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"

#include <stdint.h>
#include <stdio.h>

#include <lwip/sockets.h>

#include "iperf.h"

#include "lwip/opt.h"

#include "lwip/sys.h"
#include "lwip/api.h"

#define IPERF_PORT 5001
#define IPERF_BUFSZ (4 * 1024)

void iperf_server(void *thread_param)
{
   
   
	struct netconn *conn, *newconn;
	err_t err;
	void* recv_data;
	
	recv_data = (void *)pvPortMalloc(IPERF_BUFSZ);
	if (recv_data == NULL) {
   
   
		printf("No memory\n");
	}
	
	conn = netconn_new(NETCONN_TCP);
	netconn_bind(conn, IP_ADDR_ANY, 5001);
	
	LWIP_ERROR("tcpecho: invalid conn", (conn != NULL), return;);
	
	/* Tell connection to go into listening mode. */
	netconn_listen(conn);
	while (1)
	{
   
   
		/* Grab new connection. */
		err = netconn_accept(conn, &newconn);
		/*printf("accepted new connection %p\n", newconn);*/
		/* Process the new connection. */
		if (err == ERR_OK)
		{
   
   
			struct netbuf *buf;
// void *data;
			u16_t len;
			
			while ((err = netconn_recv(newconn, &buf)) == ERR_OK)
			{
   
   
				/*printf("Recved\n");*/
				do
				{
   
   
					netbuf_data(buf, &recv_data, &len);
// err = netconn_write(newconn, data, len, NETCONN_COPY);
				}
				while (netbuf_next(buf) >= 0);
				netbuf_delete(buf);
			}
			/*printf("Got EOF, looping\n");*/
			/* Close connection and discard connection identifier. */
			netconn_close(newconn);
			netconn_delete(newconn);
		}
	}
}
void
iperf_server_init(void)
{
   
   
	sys_thread_new("iperf_server", iperf_server, NULL, 2048, 4);
}

代码清单 ipref.h 文件内容

#ifndef LWIP_IPERF_H
#define LWIP_IPERF_H

#define TCP_SERVER_THREAD_NAME "iperf_server"
#define TCP_SERVER_THREAD_STACKSIZE 1024
#define TCP_SERVER_THREAD_PRIO 4

void iperf_server
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值