C语言实现ifconfig获取网卡接收和发送流量统计
在Windows下我们可以利用ipconfig命令获取网卡的相关信息,在Linux下命令是ifconfig
我们可以获取的信息更为丰富,其中包括网卡接收和发送的流量,用C语言实现这个命令并不是一件简单的事,由此,博主经查阅相关资料,得知,网卡的相关信息保存在 /proc/net/dev 这个文件夹下,所以,我们可以通过读取这个文件里的信息获取相应网卡的信息。
这个文件包含四部分内容,分别是:发送包的个数,发送的流量,接收包的个数,接收的流量,同时,由于网络环境在不断的变化之中,所以,这个文件的内容也是在实时更新的。
下面这张图片显示的是 ifconfig 命令的实现结果
注意,其中有许多参数,这些参数并不保存在文件中
下面是博主实现的一段C语言代码获取接收和发送的流量
重要的地方已经给出了注释
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
long *my_ipconfig(char *ath0)
{
int nDevLen = strlen(ath0);
if (nDevLen < 1 || nDevLen > 100)
{
printf("dev length too long\n");
return NULL;
}
int fd = open("/proc/net/dev", O_RDONLY | O_EXCL);
if (-1 == fd)
{
printf("/proc/net/dev not exists!\n");
return NULL;
}
char buf[1024*2];
lseek(fd, 0, SEEK_SET);
int nBytes = read(fd, buf, sizeof(buf)-1);
if (-1 == nBytes)
{
perror("read error");
close(fd);
return NULL;
}
buf[nBytes] = '\0';
//返回第一次指向ath0位置的指针
char* pDev = strstr(buf, ath0);
if (NULL == pDev)
{
printf("don't find dev %s\n", ath0);
return NULL;
}
char *p;
char *ifconfig_value;
int i = 0;
static long rx2_tx10[2];
/*去除空格,制表符,换行符等不需要的字段*/
for (p = strtok(pDev, " \t\r\n"); p; p = strtok(NULL, " \t\r\n"))
{
i++;
ifconfig_value = (char*)malloc(20);
strcpy(ifconfig_value, p);
/*得到的字符串中的第二个字段是接收流量*/
if(i == 2)
{
rx2_tx10[0] = atol(ifconfig_value);
}
/*得到的字符串中的第十个字段是发送流量*/
if(i == 10)
{
rx2_tx10[1] = atol(ifconfig_value);
break;
}
free(ifconfig_value);
}
return rx2_tx10;
}
int main()
{
long *ifconfig_result;
double re_mb;
/*eth0 是博主计算机上的网卡的名字*/
ifconfig_result = my_ipconfig("eth0");
/*保存在文件中的数值的单位是B,经过计算换算成MB*/
re_mb = (double)ifconfig_result[0]/(1024*1024);
printf("接收流量:%0.2f MB\n",re_mb);
/*保存在文件中的数值的单位是B,经过计算换算成MB*/
re_mb = (double)ifconfig_result[1]/(1024*1024);
printf("发送流量:%0.2f MB\n",re_mb);
}
保存文件的名字为 dele.c
运行相关的命令:
gcc -o dele dele.c
./dele
得到结果如下图所示
由此得到了网卡的接收和发送流量
C语言实现ifconfig获取网卡接收和发送流量统计的更多相关文章
- 【Linux环境编程】获取网卡的实时网速
在windows以下.我们能够看到360或者是qq安全卫士的"安全球".上面显示实时的网速情况.那么在linux里面怎样获取网卡的实时网速?事实上原理非常easy,读取须要获取网速 ...
- php获取网卡MAC地址源码
<?php /** 获取网卡的MAC地址原码:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $return_array = ...
- Python 获取 网卡 MAC 地址
/*********************************************************************** * Python 获取 网卡 MAC 地址 * 说明: ...
- PHP获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址
声明转换于其它博客当中的. <?php /** 获取网卡的MAC地址原码:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $ ...
- [日常] GO语言圣经-并发获取多个URL
go语言圣经-并发获取多个URL 1.GO最新奇的特性就是对并发编程的支持,goroutine和channel 2.goroutine是一种函数的并发执行方式,而channel是用来在goroutin ...
- ubuntu下仅仅获取网卡一的ip地址 && shell中字符串拼接
问题描述: ubuntu下仅仅获取网卡一的ip地址 问题背景: eth0,eth1,eth2……代表网卡一,网卡二,网卡三…… lo代表127.0.0.1,即localhost | 问题描述: 已知字 ...
- 获取网卡速率,cpu使用率
];//获取网卡名称 PerformanceCounter NetworkR = new PerformanceCounter("Network Interface", " ...
- linux -小记(1) 问题:"linux ifconfig查看网卡名称与配置文件不否" 或 启动网卡提示“ eth0 似乎不存在, 初始化操作将被延迟”。
"linux ifconfig查看网卡名称与配置文件不否" 或 启动网卡提示" eth0 似乎不存在, 初始化操作将被延迟" . 问题 1. service n ...
- ios开发 iphone中获取网卡地址和ip地址
这是获取网卡的硬件地址的代码,如果无法编译通过,记得把下面的这几个头文件加上把. #include <sys/socket.h> // Per msqr#include <sys/s ...
随机推荐
- 分布式一致性协议Raft原理与实例
分布式一致性协议Raft原理与实例 1.Raft协议 1.1 Raft简介 Raft是由Stanford提出的一种更易理解的一致性算法,意在取代目前广为使用的Paxos算法.目前,在各种主流语言中都有 ...
- ThreadLocal深入剖析
JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序,Threa ...
- HA机制下的Hadoop配置
[版权申明:本文系作者原创,转载请注明出处] 文章出处:http://www.cnblogs.com/sdksdk0/p/5585355.html 作者: 朱培 ID:sdksdk0 ----- ...
- OpenCV + Python 人脸检测
必备知识 Haar-like opencv api 读取图片 灰度转换 画图 显示图像 获取人脸识别训练数据 探测人脸 处理人脸探测的结果 实例 图片素材 人脸检测代码 人脸检测结果 总结 下午的时候 ...
- 27 自定义View 和案例
有时安卓提供的View不满足我们的需求时可以创建一个类继承View或其子类重写方法 如 package com.qf.sxy.day28_customview.view; import android ...
- Android双击退出
重写返回键 private long tempTime = 0; /** * 双击退出 */ @Override public void onBackPressed() { long firstCli ...
- collection 中对类排序
首先 写出 一个person类 让他继承Comparable 构造函数和get/set不用说 我们要覆盖父类中的comparto方法 代码如下 省略get/set package a; public ...
- 剑指Offer——巧妙使用sort(List<T>,Comparator<? super T>)比较器
剑指Offer--巧妙使用sort(List<T>,Comparator<? super T>)比较器 先入为主 package cn.edu.ujn.offersword; ...
- 多线程之Java线程阻塞与唤醒
线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题.如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节.在Java ...
- Android 增量更新和升级
在年初的时候,尝试了一把热修复技术,当时选择的是阿里的andfix,使用起来也很简单,这里就不在多少,如果你对andfix有兴趣请链接:点击打开链接.虽然网上将热修复的文章很多,不过我还是想说原理,然 ...