Linux C/C++ 显示NIC流量统计信息

news2024/12/25 10:31:46

NIC流量统计信息是由操作系统维护的。当数据包通过NIC传输时,操作系统会更新相关的计数器。这些计数器记录了数据包的发送和接收数量、字节数等。通过读取这些计数器,我们可以获得关于网络流量的信息。

为什么需要这些信息? 可以使用这些信息来监控网络性能、诊断网络问题或确定网络流量的模式。例如,如果发现某个时间段的数据包接收数量异常高,可能意味着有DDoS攻击或网络拥塞问题。

如何使用Linux命令获取流量统计信息

要显示网络接口(NIC)的流量统计信息,可以使用一些命令行工具。最常用的工具是ifconfig和ip命令。

使用ifconfig命令,可以通过指定网络接口名称来查看相关信息。例如,使用以下命令可以显示eth0接口的流量统计信息:

ifconfig eth0

使用ip命令的方式与ifconfig类似,可以显示网络接口的详细信息。例如,可以使用以下命令显示eth0接口的流量统计信息:

ip -s link show eth0

另外,你也可以使用一些其他工具来进行更详细的统计和分析,如ntop、iptraf、iftop、sar等。这些工具提供了更多的选项和图形化界面,可以更方便地查看和分析流量统计信息。

想要了解更多的解析,可以参考Linux的网络管理文档,如Linux网络管理指南或相关的官方文档。在命令行中输入以下命令可以查看相关文档:

man ifconfig
man ip

这里需要注意的是,具体的命令和工具可能会有一些不同的参数和输出格式。在使用具体的命令行工具时,可以参考工具的文档和帮助信息来了解详细的使用方法和输出解释。

/proc/net/dev

在Linux中,/proc/net/dev是一个特殊的文件,它包含了有关网络设备(如网卡)的统计信息。该文件是通过proc文件系统提供的一种方式来访问内核数据结构。

具体来说,/proc/net/dev文件提供了每个网络接口的详细统计信息,包括接收和发送的字节数、数据包数、错误计数等。这些信息对于网络的性能分析和故障排除非常有用。

通过读取/proc/net/dev文件,可以获取有关系统中每个网络接口的实时信息。此外,还可以使用一些工具(如ifconfig命令、ip命令等)来显示/proc/net/dev文件的内容以更直观地查看接口的统计信息。

所以,如果想要了解Linux系统中的网络统计信息,可以通过查看/proc/net/dev文件来获取相关的数据。

Linux C/C++ 显示NIC流量统计信息

...
void AddCount(int devnum, u32 rp1, u32 rb1, u32 tp1, u32 tb1)
{
	if (devnum >= MAXDEV)
		return;
	if (lrp[devnum] < rp1)
		rp[devnum] = rp1 - lrp[devnum], lrp[devnum] = rp1;
	else
		lrp[devnum] = rp1, rp[devnum] = 0;
	if (lrb[devnum] < rb1)
		rb[devnum] = rb1 - lrb[devnum], lrb[devnum] = rb1;
	else
		lrb[devnum] = rb1, rb[devnum] = 0;
	if (ltp[devnum] < tp1)
		tp[devnum] = tp1 - ltp[devnum], ltp[devnum] = tp1;
	else
		ltp[devnum] = tp1, tp[devnum] = 0;
...
}

float Nom1(float f)
{
	while (f > 1000)
		f = f / 1000;
	return f;
}

char Nom2(float f)
{
	if (f < 1e3)
		return ' ';
	if (f < 1e6)
		return 'K';
	if (f < 1e9)
		return 'M';
	if (f < 1e12)
		return 'G';
	return 'T';
}

void dostatis()
{
...
	fp = fopen("/proc/net/dev", "r");
	if (fp == NULL) {
		fprintf(stderr, "Could not open /proc/net/dev\n");
		sleep(30);
		return;
	}
	while (fgets(buf, MAXLEN, fp) != NULL) {
		unsigned long int rp1, rb1, tp1, tb1, ign;
		int devnum, i;
		char *devn;
		char *p = buf;
		while (*p == ' ')
			p++;
		if (*p == 0)
			continue;
		devn = p;
		while (*p && (*p != ':'))
			p++;
		if (*p == 0)
			continue;
		*p = 0;
		p++;

...
		if (sscanf(p, "%lu %lu %lu %lu %lu %lu %lu %lu %lu %lu",
			   &rb1, &rp1, &ign, &ign, &ign, &ign, &ign, &ign, &tb1, &tp1) != 10) {
			fprintf(stderr, "Could not open /proc/net/dev\n");
			sleep(30);
			continue;
		}
		//      printf("%d %lu %lu %lu %lu\n",devnum,rp1,rb1,tp1,tb1);
		AddCount(devnum, rp1, rb1, tp1, tb1);
	}
	fclose(fp);
	if ((outlen == 0) || (outlen == 20)) {
		for (i = 0; i < totaldev; i++)
			printf("+-----------------------");
		printf("+\n");
		for (i = 0; i < totaldev; i++) {
			int x;
			printf("|");
			for (x = 0; x < 23 / 2 - strlen(devname[i]) / 2; x++)
				printf(" ");
			printf("%s", devname[i]);
...
				printf(" ");
		}
		printf("|\n");
		for (i = 0; i < totaldev; i++)
			printf("|      TX         RX    ");
		printf("|\n");
		for (i = 0; i < totaldev; i++)
			printf("|  PPS   BPS   PPS   BPS");
		printf("|\n");
		for (i = 0; i < totaldev; i++)
			printf("+-----------------------");
		printf("+\n");
...
	}
	outlen++;
	printf("|");
	for (i = 0; i < totaldev; i++) {
		printf("%4.0f%c %4.0f%c %4.0f%c %4.0f%c|",
		       Nom1((float)tp[i]), Nom2((float)tp[i]),
		       Nom1((float)tb[i] * 8.0), Nom2((float)tb[i] * 8.0),
		       Nom1((float)rp[i]), Nom2((float)rp[i]),
		       Nom1((float)rb[i] * 8.0), Nom2((float)rb[i] * 8.0));
	}
	printf("\n");

}

int main(int argc, char *argv[])
{
...
	for (i = 1; i < argc; i++) {
		if (strcmp(argv[i], "-h") == 0) {
			printf("Usage: nettraf [ -h ] [ NIC1 ] [ NIC2 ] [ NIC3 ]\n");
			exit(0);
		}
		if (totaldev >= MAXDEV) {
			printf("too much devs\n");
		}
		strncpy(devname[totaldev], argv[i], DEVNAMELEN);
		totaldev++;
	}
	if (totaldev == 0) {
		FILE *fp;
		char buf[MAXLEN];
		fp = fopen("/proc/net/dev", "r");
		if (fp == NULL) {
			fprintf(stderr, "Could not open /proc/net/dev\n");
			exit(0);
		}
		while (fgets(buf, MAXLEN, fp) != NULL) {
			char *devn;
			char *p = buf;
...
			devn = p;
			while (*p && (*p != ':'))
				p++;
			if (*p == 0)
				continue;
			*p = 0;
			strncpy(devname[totaldev], devn, DEVNAMELEN);
			totaldev++;
			if (totaldev == MAXDEV)
				break;
		}
		fclose(fp);
	}
...
}

If you need the complete source code, please add the WeChat number (c17865354792)

运行效果:

这里描述一下代码中截图,在网卡流量统计中,有一些常见的指标和术语,如PPS、BPS、TX和RX。下面对它们进行一一解释:

  1. PPS(Packets Per Second,每秒数据包数):指单位时间内通过网卡的数据包数量。PPS代表了网络流量的频率,可以用来衡量网络带宽的使用情况。

  2. BPS(Bits Per Second,每秒位数):指单位时间内通过网卡的总位数。BPS用于衡量网络流量的速率,即网络吞吐量。常见的单位有Mbps(兆位每秒)和Gbps(千兆位每秒)。

  3. TX(Transmit,发送):表示从本地主机发送的数据量。TX指标包括发送的数据包数量、发送的字节数和发送的错误数量等信息。

  4. RX(Receive,接收):表示从网络接收到的数据量。RX指标包括接收到的数据包数量、接收到的字节数和接收到的错误数量等信息。

这些指标和术语提供了对网卡流量的不同方面的了解。通过了解这些指标,可以分析网络的使用情况、网络连接的稳定性以及网络带宽的利用率等。在网络管理和故障排除中,对这些指标的监测和分析是非常有用的。

总结

NIC流量统计信息显示了网络接口卡(NIC)上的数据传输情况,包括发送和接收的数据包数量、字节数等。通过查看这些信息,可以了解网络连接的使用情况,以便进行网络性能优化和故障排查。

Welcome to follow WeChat official account【程序猿编码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1372580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux的网络服务DHCP

一.了解DHCP服务 1.1 DHCP定义 DHCP&#xff08;动态主机配置协议&#xff09;是一个局域网的网络协议。指的是由服务器控制一段IP地址范围&#xff0c;客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下&#xff0c;DHCP作为Windows Server的一个服…

【Python】使用tkinter设计开发Windows桌面程序记事本(2)

上一篇&#xff1a;【Python】使用tkinter设计开发Windows桌面程序记事本&#xff08;1&#xff09;-CSDN博客 下一篇&#xff1a; 作者发炎 此代码模块是继承上一篇文章的代码模块的基础上开始设计开发的。 如果不知道怎么新建"记事本项目"文件夹&#xff0c;请参…

程序员试用期转正工作总结

一、试用期工作总结 在公司的三个月试用期中&#xff0c;我完成了以下工作&#xff1a; 完成了XX个功能模块的开发&#xff0c;包括XX模块、XX模块和XX模块。参与了XX个项目的开发和上线&#xff0c;其中XX项目、XX项目和XX项目是我主导的。优化了现有系统的性能&#xff0c;特…

跟着我学Python进阶篇:02.面向对象(上)

往期文章 跟着我学Python基础篇&#xff1a;01.初露端倪 跟着我学Python基础篇&#xff1a;02.数字与字符串编程 跟着我学Python基础篇&#xff1a;03.选择结构 跟着我学Python基础篇&#xff1a;04.循环 跟着我学Python基础篇&#xff1a;05.函数 跟着我学Python基础篇&#…

计算机体系结构----寄存器重命名/Tomasulo算法

前情提要 计分板算法可看我写的博文计算机体系结构----计分板&#xff08;scoreboard&#xff09;算法 Tomasulo算法的核心是寄存器重命名&#xff08;register renaming&#xff09;&#xff1b;通过寄存器重命名&#xff0c;可彻底消除WAR/WAW冲突&#xff0c;计分板算法中…

2024--Django平台开发-Django知识点(五)

day05 django知识点 今日概要&#xff1a; 中间件 【使用】【源码】cookie 【使用】【源码 - Django底层请求本质】session【使用】【源码 - 数据库请求周期中间件】 1.中间件 1.1 使用 编写类&#xff0c;在类型定义&#xff1a;process_request、process_view、process_…

C++重新认知:inline关键字

一、为什么要使用inline关键字 在C中.&#xff0c;为了解决频繁调用小函数造成大量消耗栈空间的问题&#xff0c;引进了inline关键字&#xff0c;inline修饰的函数为内敛函数&#xff08;频繁大量的使用栈空间会造成栈溢出&#xff09;。 在这段代码中&#xff0c;每次执行for…

RT-Thread:SPI万能驱动 SFUD 驱动Flash W25Q64,通过 STM32CubeMX 配置 STM32 SPI 驱动

关键词&#xff1a;SFUD,FLASH,W25Q64&#xff0c;W25Q128&#xff0c;STM32F407 说明&#xff1a;RT-Thread 系统 使用 SPI万能驱动 SFUD 驱动 Flash W25Q64&#xff0c;通过 STM32CubeMX 配置 STM32 SPI 驱动。 提示&#xff1a;SFUD添加后的存储位置 1.打开RT-Thread Sett…

【obj To 3DTiles 格式转换】 可以自定义经纬高、属性表等参数 (一)

目录 0 引言1 3DTiles数据2 objTo3DTiles2.1 工具的安装2.1.1 拓展&#xff1a;Node.js 和 npm 2.2 工具的使用2.2.1 输出成瓦片数据2.2.2 输出带有坐标参数的瓦片数据 3 查看3DTiles数据 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;Cesiumfor…

强化学习9——免模型预测算法介绍(蒙特卡洛方法和时步差分方法)

对于大部分情况来说&#xff0c;环境是未知的&#xff0c;也就是说状态转移概率未知&#xff0c;对于这种情况的算法称为免模型预测算法。免模型算法与环境不断交互学习&#xff0c;但是需要大量的运算。 蒙特卡洛方法 蒙特卡罗方法通过重复随机抽选&#xff0c;之后运用统计…

条款21:必须返回对象时,别妄想返回其引用

考虑一个表示有理数的类&#xff0c;其中包含一个计算两个有理数相乘的函数: class Rational { public:Rational(int numerator 0, int denominator 1) :n{ numerator }, d{ denominator }{} private:int n, d; // 分子和分母friend const Rational& operator*(const R…

vue知识-03

购物车案例 要实现的功能&#xff1a; 1、计算商品总价格 2、全选框和取消全选框 3、商品数量的增加和减少 <body> <div id"app"><div class"row"><div class"col-md-6 col-md-offset-3"><h1 class"text-center…

C++模板——(4)C++泛型编程与标准模板库简介

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 勤奋&#xff0c;机会&#xff0c;乐观…

苍穹外卖Day01——解决总结1中存在的问题

前序章节&#xff1a; 苍穹外卖Day01——总结1 解决总结1中存在的问题 1. 什么是JWT2. POJO、Entity、VO、DTO3. Nginx&#xff08;反向代理&#xff09;4. Data注解 1. 什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一种用于在网络应用间传递信息的开放标准&#…

智慧校园电子班牌管理系统源码 Java Android原生

智慧校园电子班牌系统源码是一种智能化的教育管理解决方案&#xff0c;它可以在学校内实现信息共享、教学管理、学生管理、家校互通等各个方面的协调与配合&#xff0c;帮助教师、学生和家长更加高效地开展教学活动、管理学生、协同合作&#xff0c;从而推动学校教育水平的提高…

【高等数学之泰勒公式】

一、从零开始 1.1、泰勒中值定理1 什么是泰勒公式?我们先看看权威解读: 那么我们从古至今到底是如何创造出泰勒公式的呢? 由上图可知&#xff0c;任一无穷小数均可以表示成用一系列数字的求和而得出的结果&#xff0c;我们称之为“无穷算法”。 那么同理我们想对任一曲线来…

Ubuntu启动Xming报错:cannot open display: :1.0

Ubuntu启动Xming报错&#xff1a;cannot open display: :1.0 1、问题描述&#xff1a;2、问题解决&#xff1a;3、实践结果&#xff1a; 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一起加油进阶吧&#xff01; 1、…

Android 事件分发介绍

文章目录 一、目的二、环境三、相关概念3.1 事件分发 四、详细设计4.1应用布局4.1.1 应用布局结构4.1.2 LayoutInspector 4.2 关键View&方法4.2.1 相关View4.2.2 相关方法4.2.3 View与方法关系 4.3 事件分发概念图4.3.1 事件分发类图4.3.2 事件分发模型图 4.4 Activity组件…

C#编程-描述异常

描述异常 异常是在程序执行期间出现的错误。异常情况发生在运算不能正常完成的时候。当程序中出现异常是,系统会抛出错误。错误通过异常处理过程被处理。 例如,System.IO.IOException异常在试图访问非法流对象时抛出。同样,如果分母是0,整数除法运算抛出System.DivideByZ…

02.构建和使用的大型语言模型(LLMs)阶段

我们为什么要建立自己的LLMs?LLM从头开始编码是了解其机制和局限性的绝佳练习。此外,它还为我们提供了必要的知识,可以保留或微调现有的开源LLM架构,以适应我们自己的特定领域的数据集或任务。 研究表明,在建模性能方面,定制(LLMs为特定任务或领域量身定制的)可以胜过…