副标题#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
获得功效如下图所示

由此获得了网卡的吸收和发送流量
