linux网络带宽,网速检测

本文介绍了如何在Linux环境下使用iperf进行网络带宽检测,并提供了C语言编写的程序来实时监测网络接收和发送速率。程序通过读取/proc/net/dev文件获取网络设备的流量信息,计算出每秒的网络速率。此外,还分享了iperf工具的下载链接和编译配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络带宽检测一般使用iperf

下面的两个连接是linux和PC端工具下载,下载3.1.3就可以了,其他版本试了几个,低版本编译不过,高版本需要交叉编译工具带有openssl库
https://iperf.fr/iperf-download.php
https://downloads.es.net/pub/iperf/

修改编译配置:
https://blog.youkuaiyun.com/u012153439/article/details/79699414

./configure --host=arm --prefix=$(pwd)/…/out/ --host=arm-hisiv300-linux CFLAGS=-static --enable-static LDFLAGS=-static --disable-shared

在这里插入图片描述

执行步骤:
服务端:
解压iperf-3.1.3-win64.zip到PC的纯英文目录
WIN+R 打开命令提示符界面,按照如下步骤执行命令
在这里插入图片描述在这里插入图片描述

客户端:
把iperf3放到虚拟机下挂载执行
./iperf3 -c PC端的IP

在linux下的检测依据的是/proc/net/dev中的信息
c源码:

/************************************************************************************************
*****Describe: This program is writen to detect the network bite rate                       *****
*****Email: lishuangliang@outlook.com                                                       *****
*****Author: shuang liang li																*****
*****Date: 2018-05-20																		*****
*************************************************************************************************/
#include <sys/types.h>  
#include <sys/stat.h> 
#include <sys/ioctl.h> 
#include <sys/socket.h>
#include <sys/wait.h> 
#include <sys/time.h>
#include <arpa/inet.h>
#include <unistd.h> 
#include <stdio.h>  
#include <stdlib.h>
#include <string.h>  
#include <pthread.h>   
#include <dirent.h> 
#include <time.h>
#include <fcntl.h> 
#include <errno.h>


#ifdef debugprintf
	#define debugpri(mesg, args...) fprintf(stderr, "[NetRate print:%s:%d:] " mesg "\n", __FILE__, __LINE__, ##args) 
#else
	#define debugpri(mesg, args...)
#endif
 
int GetNetRate(FILE* fd,char *interface,long *recv,long *send)
{
	char buf[1024];
	char *p;
	char flow[32];
	int i = 0;	
	char tempstr[16][16]={0};
	
	memset(buf,0,sizeof(buf));
	memset(tempstr,0,sizeof(tempstr));
	fseek(fd, 0, SEEK_SET);
	int nBytes = fread(buf,1, sizeof(buf)-1,fd);
	if (-1 == nBytes)
	{
		debugpri("fread error");
		fclose(fd);
		return -1;
	}
	buf[nBytes] = '\0';
	char* pDev = strstr(buf, interface);
	if (NULL == pDev)
	{
		printf("don't find dev %s\n", interface);
		fclose(fd);
		return -1;
	}
	sscanf(pDev,"%[^' ']\t%[^' ']\t%[^' ']\t%[^' ']\t%[^' ']\t%[^' ']\t%[^' ']\t%[^' ']\t%[^' ']\t%[^' ']\t%[^' ']\t%[^' ']\t",\
	tempstr[0],tempstr[1],tempstr[2],tempstr[3],tempstr[4],tempstr[5],tempstr[6],tempstr[7],tempstr[8],tempstr[9],tempstr[10],tempstr[11]);
	//printf("%s\n%s\n%s\n%s\n%s\n",tempstr[0],tempstr[1],tempstr[2],tempstr[9],tempstr[10]);
	*recv = atol(tempstr[1]);		
	*send = atol(tempstr[9]);	
}	 
 int main(int argc, char** argv)  
 {  
	struct timeval tv_now,tv_pre;
	char netdevice[16]={0};
	int nDevLen; 	
	long recvpre = 0,recvcur = 0;
	long sendpre = 0,sendcur = 0;
	double sendrate;
	double recvrate;
	
	if(argc != 2)
	{
		printf("Usage: netrate <network device>\n");
		exit(0);
	}
	
	nDevLen = strlen(argv[1]);
	if (nDevLen < 1 || nDevLen > 10)
	{
		printf("unkown device\n");
		exit(0);
	}
	sprintf(netdevice,"%s",argv[1]);
	FILE* fd = fopen("/proc/net/dev","r+");
	if (NULL == fd)
	{
		debugpri("/proc/net/dev not exists!\n");
		return -1;
	}
	while(1)
	{	
		gettimeofday(&tv_pre,NULL);
		GetNetRate(fd,netdevice,&recvpre,&sendpre);
		sleep(2);
		gettimeofday(&tv_now,NULL);
		GetNetRate(fd,netdevice,&recvcur,&sendcur);
		recvrate= (recvcur - recvpre)/(1024*(tv_now.tv_sec+tv_now.tv_usec*0.000001-tv_pre.tv_sec+tv_pre.tv_usec*0.000001));
		if(recvrate<0)
		{
			recvrate = 0;
		}
		sendrate= (sendcur - sendpre)/(1024*(tv_now.tv_sec+tv_now.tv_usec*0.000001-tv_pre.tv_sec+tv_pre.tv_usec*0.000001));
		if(sendrate<0)
		{
			sendrate = 0;
		}
		system("clear");
		printf("NetWorkRate Statistic Verson 0.0.1\n");
		printf("Net Device	receive rate	send rate\n");
		printf("%-10s\t%-6.2fKB/sec\t%-6.2fKB/sec\n",netdevice,recvrate,recvrate);
	}
	fclose(fd);
	return 0;
 }   
					

Makefile

CC = arm-hisiv300-linux-gcc
all:
	$(CC) netrate.c -D debugprintf  -o netrate	
clean:
	rm -f netrate
TestBandwitdth脚本用于测试带宽; //***************************************************************************************** 用法: 1.将“TestBandwidth.tar.gz”脚本copy到服务器上解压后,进入目录; 2.编辑“TestURL.sh”:灌流量; 上行:wget http://*** 下行:post http://*** 3.如果修改了步骤2,执行此步,否则跳过: 修改 TestBandwidth.tar.gz 脚本中的倒数5-6行; kill -9 `ps -ef|grep wget|grep http|awk '{print $2}'` //修改kill关键字:grep wget rm zhuxian* //修改rm关键字:zhuxian* 4.修改“bandwidth.sh”:修改检测网卡: netcard=em1 5.使用后台运行命令执行:nohup ./bandwidth.sh (注:停止脚本 pkill -9 bandwidth.sh && pkill -9 wget) 6.查看结果:BandwitdthResult.txt //********************************************************* 测试流量:清空“TestURL.sh”文件时执行就是测试流量 //***************************************************************************************** 脚本说明: 1.调用TestURL.sh脚本启动灌流量操作; 2.等待10s(防止刚开始下载时的流量冲高); 3.取当前网卡已接收的上行、下行数据流量; 4.等待5s; 5.取当前网卡已接收的上行、下行数据流量; 6.计算两次取值中间的差值,算平均值; 7.等待10s,开始下一次小循环(循环4次)(一次小循环70s); 8.清除下载进程,清除下载文件,清除下载日志; 9.等待3495s,开始下一次大循环(一次大循环1h);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值