C语言实现ifconfig获取网卡接收和发送流量统计

在Windows下我们可以利用ipconfig命令获取网卡的相关信息,在Linux下命令是ifconfig

我们可以获取的信息更为丰富,其中包括网卡接收和发送的流量,用C语言实现这个命令并不是一件简单的事,由此,博主经查阅相关资料,得知,网卡的相关信息保存在 /proc/net/dev  这个文件夹下,所以,我们可以通过读取这个文件里的信息获取相应网卡的信息。

这个文件包含四部分内容,分别是:发送包的个数,发送的流量,接收包的个数,接收的流量,同时,由于网络环境在不断的变化之中,所以,这个文件的内容也是在实时更新的。

下面这张图片显示的是 ifconfig 命令的实现结果

注意,其中有许多参数,这些参数并不保存在文件中

下面是博主实现的一段C语言代码获取接收和发送的流量

重要的地方已经给出了注释

 

[cpp][/cpp] 

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <unistd.h>
  7. #include <stdlib.h>
  8. long *my_ipconfig(char *ath0)
  9. {
  10.     int nDevLen = strlen(ath0);
  11.     if (nDevLen < 1 || nDevLen > 100)
  12.     {
  13.         printf(“dev length too long\n”);
  14.         return NULL;
  15.     }
  16.     int fd = open(“/proc/net/dev”, O_RDONLY | O_EXCL);
  17.     if (-1 == fd)
  18.     {
  19.         printf(“/proc/net/dev not exists!\n”);
  20.         return NULL;
  21.     }
  22.         char buf[1024*2];
  23.         lseek(fd, 0, SEEK_SET);
  24.         int nBytes = read(fd, buf, sizeof(buf)-1);
  25.         if (-1 == nBytes)
  26.         {
  27.             perror(“read error”);
  28.             close(fd);
  29.             return NULL;
  30.         }
  31.         buf[nBytes] = ‘\0’;
  32.         //返回第一次指向ath0位置的指针
  33.         char* pDev = strstr(buf, ath0);
  34.         if (NULL == pDev)
  35.         {
  36.             printf(“don’t find dev %s\n”, ath0);
  37.             return NULL;
  38.         }
  39.         char *p;
  40.         char *ifconfig_value;
  41.         int i = 0;
  42.         static long rx2_tx10[2];
  43.         /*去除空格,制表符,换行符等不需要的字段*/
  44.         for (p = strtok(pDev, ” \t\r\n”); p; p = strtok(NULL, ” \t\r\n”))
  45.         {
  46.             i++;
  47.             ifconfig_value = (char*)malloc(20);
  48.             strcpy(ifconfig_value, p);
  49.             /*得到的字符串中的第二个字段是接收流量*/
  50.             if(i == 2)
  51.             {
  52.                 rx2_tx10[0] = atol(ifconfig_value);
  53.             }
  54.             /*得到的字符串中的第十个字段是发送流量*/
  55.             if(i == 10)
  56.             {
  57.                 rx2_tx10[1] = atol(ifconfig_value);
  58.                 break;
  59.             }
  60.             free(ifconfig_value);
  61.         }
  62.         return rx2_tx10;
  63. }
  64. int main()
  65. {
  66.     long *ifconfig_result;
  67.     double re_mb;
  68.     /*eth0 是博主计算机上的网卡的名字*/
  69.     ifconfig_result = my_ipconfig(“eth0”);
  70.     /*保存在文件中的数值的单位是B,经过计算换算成MB*/
  71.     re_mb = (double)ifconfig_result[0]/(1024*1024);
  72.     printf(“接收流量:%0.2f MB\n”,re_mb);
  73.     /*保存在文件中的数值的单位是B,经过计算换算成MB*/
  74.     re_mb = (double)ifconfig_result[1]/(1024*1024);
  75.     printf(“发送流量:%0.2f MB\n”,re_mb);
  76. }

保存文件的名字为 dele.c

 

运行相关的命令:

gcc -o dele dele.c

./dele

得到结果如下图所示

由此得到了网卡的接收和发送流量

标签