在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. 5秒让你的View变3D,ThreeDLayout使用和实现

    在很久很久以前,写了一篇自定义3d view的博客.但是只是讲了如何实现,实现起来还是比较耗时,所以本着平易近人的心态,把他封装成了一个ViewGroup,只需要在你的view或者布局外面包裹一层Th ...

  2. Openstack: MP-BIOS bug: 8254 timer not connected to IO-APIC

    Issue: After you import an linux image into openstack and run an instance of it, you may find that t ...

  3. IOS开发初体验

    IOS开发初体验 搭建开发环境 不多说什么了,开发环境的搭建太简单了,上App Store搜索XCode下载就行了,说多了都是眼泪 创建第一个IOS项目--HolleIOS 创建工程 选择工程创建位置 ...

  4. android M Launcher之LauncherModel (三)

    通过前两篇的分析,我们已经知道了LauncherModel的初始化及工作流程,如果您还不熟悉的话请看前两篇博文 android M Launcher之LauncherModel (一) android ...

  5. iOS 应用提交到iTunes Connect,显示"正在处理"后消失不见

    打包上传iTunes Connect 成功后,进入iTunes Connect 会看到如下的构建信息: 可是,过一会再刷新该页面,构建的版本就消失了. 出现如上所述的情况,主要目前已知的有两种原因: ...

  6. 【mybatis深度历险系列】mybatis中的输入映射和输出映射

    在前面的博文中,小编介绍了mybatis的框架原理以及入门程序,还有mybatis中开发到的两种方法,原始开发dao的方法和mapper代理方法,今天博文,我们来继续学习mybatis中的相关知识,随 ...

  7. C++ 虚函数表 多重继承

    上次研究的是单继承的情况,这次研究多重继承下的虚函数表的排列情况. 这次A,A1,A2,B这几个类的继承关系如下图: 测试代码如下: #include<iostream> using na ...

  8. Not saving crash log because we have reached the limit for logs to store on disk.解决办法

    一.问题简述: Xcode, window>Devices>DEVICES选中自已的设备,打开控制台:提示日志存量已达限制,这个是系统抛出的log."Not saving cra ...

  9. Android逆向工程

    在Root前提下,我们可以使用Hooker方式绑定so库,通过逆向方式篡改数值,从而达到所谓破解目的.然而,目前无论是软件加固方式,或是数据处理能力后台化,还是客户端数据真实性验证,都有了一定积累和发 ...

  10. EJB_开发EJB容器模型的WEB服务

    开发EJB容器模型的WEB服务 WEB服务 Web服务也是一种分布式技术,它与EJB最大的不同是,Web服务属于行业规范,可以跨平台及语言.而EJB属于Java平台的规范,尽管理论上可以跨平台,但实现 ...