副标题#e#
在Windows下我们可以操作ipconfig呼吁获取网卡的相关信息,在Linux下呼吁是ifconfig
我们可以 获取的信息更为富厚,个中包罗网卡吸收和发送的流量,用C语言实现这个呼吁并不是一件简朴的事,由此, 博主经查阅相关资料,得知,网卡的相关信息生存在 /proc/net/dev 这个文件夹下,所以,我们可以 通过读取这个文件里的信息获取相应网卡的信息。
这个文件包括四部门内容,别离是:发送包的个数 ,发送的流量,吸收包的个数,吸收的流量,同时,由于网络情况在不绝的变革之中,所以,这个文件的内容 也是在及时更新的。
下面这张图片显示的是 ifconfig 呼吁的实现功效
留意,个中有很多参数,这些参数并不生存在文件中
#p#副标题#e#
下面是博主实现的一段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
获得功效如下图所示
由此获得了网卡的吸收和发送流量