在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获取网卡接收和发送流量统计的更多相关文章

  1. 【Linux环境编程】获取网卡的实时网速

    在windows以下.我们能够看到360或者是qq安全卫士的"安全球".上面显示实时的网速情况.那么在linux里面怎样获取网卡的实时网速?事实上原理非常easy,读取须要获取网速 ...

  2. php获取网卡MAC地址源码

    <?php /** 获取网卡的MAC地址原码:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $return_array = ...

  3. Python 获取 网卡 MAC 地址

    /*********************************************************************** * Python 获取 网卡 MAC 地址 * 说明: ...

  4. PHP获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址

    声明转换于其它博客当中的. <?php /** 获取网卡的MAC地址原码:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $ ...

  5. [日常] GO语言圣经-并发获取多个URL

    go语言圣经-并发获取多个URL 1.GO最新奇的特性就是对并发编程的支持,goroutine和channel 2.goroutine是一种函数的并发执行方式,而channel是用来在goroutin ...

  6. ubuntu下仅仅获取网卡一的ip地址 && shell中字符串拼接

    问题描述: ubuntu下仅仅获取网卡一的ip地址 问题背景: eth0,eth1,eth2……代表网卡一,网卡二,网卡三…… lo代表127.0.0.1,即localhost | 问题描述: 已知字 ...

  7. 获取网卡速率,cpu使用率

    ];//获取网卡名称 PerformanceCounter NetworkR = new PerformanceCounter("Network Interface", " ...

  8. linux -小记(1) 问题:"linux ifconfig查看网卡名称与配置文件不否" 或 启动网卡提示“ eth0 似乎不存在, 初始化操作将被延迟”。

    "linux ifconfig查看网卡名称与配置文件不否" 或 启动网卡提示" eth0 似乎不存在, 初始化操作将被延迟" . 问题 1. service n ...

  9. ios开发 iphone中获取网卡地址和ip地址

    这是获取网卡的硬件地址的代码,如果无法编译通过,记得把下面的这几个头文件加上把. #include <sys/socket.h> // Per msqr#include <sys/s ...

随机推荐

  1. 分布式一致性协议Raft原理与实例

    分布式一致性协议Raft原理与实例 1.Raft协议 1.1 Raft简介 Raft是由Stanford提出的一种更易理解的一致性算法,意在取代目前广为使用的Paxos算法.目前,在各种主流语言中都有 ...

  2. ThreadLocal深入剖析

    JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序,Threa ...

  3. HA机制下的Hadoop配置

    [版权申明:本文系作者原创,转载请注明出处] 文章出处:http://www.cnblogs.com/sdksdk0/p/5585355.html 作者: 朱培    ID:sdksdk0 ----- ...

  4. OpenCV + Python 人脸检测

    必备知识 Haar-like opencv api 读取图片 灰度转换 画图 显示图像 获取人脸识别训练数据 探测人脸 处理人脸探测的结果 实例 图片素材 人脸检测代码 人脸检测结果 总结 下午的时候 ...

  5. 27 自定义View 和案例

    有时安卓提供的View不满足我们的需求时可以创建一个类继承View或其子类重写方法 如 package com.qf.sxy.day28_customview.view; import android ...

  6. Android双击退出

    重写返回键 private long tempTime = 0; /** * 双击退出 */ @Override public void onBackPressed() { long firstCli ...

  7. collection 中对类排序

    首先 写出 一个person类 让他继承Comparable 构造函数和get/set不用说 我们要覆盖父类中的comparto方法 代码如下 省略get/set package a; public ...

  8. 剑指Offer——巧妙使用sort(List<T>,Comparator<? super T>)比较器

    剑指Offer--巧妙使用sort(List<T>,Comparator<? super T>)比较器 先入为主 package cn.edu.ujn.offersword; ...

  9. 多线程之Java线程阻塞与唤醒

    线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题.如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节.在Java ...

  10. Android 增量更新和升级

    在年初的时候,尝试了一把热修复技术,当时选择的是阿里的andfix,使用起来也很简单,这里就不在多少,如果你对andfix有兴趣请链接:点击打开链接.虽然网上将热修复的文章很多,不过我还是想说原理,然 ...