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

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

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

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

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

0818b9ca8b590ca3270a3433284dd417.png

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

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

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

#include

#include

#include

#include

#include

#include

#include

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

得到结果如下图所示

0818b9ca8b590ca3270a3433284dd417.png

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你不想使用ifconfig命令,可以使用Linux系统提供的/proc文件系统来获取网络接口的流量统计信息。/proc/net/dev文件中存储了所有网络接口的统计信息,包括上传和下载的字节数。你可以在代码中读取该文件,然后解析出需要的统计信息。 以下是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define MAX_COMMAND_LEN 1024 int main() { char buf[1024]; FILE *fp; int upload1, download1, upload2, download2; while(1) { fp = fopen("/proc/net/dev", "r"); if(fp == NULL) { printf("Failed to open /proc/net/dev\n"); return -1; } // 跳过前两行 fgets(buf, sizeof(buf), fp); fgets(buf, sizeof(buf), fp); // 读取网卡eth0的统计信息 fgets(buf, sizeof(buf), fp); sscanf(buf + 5, "%d %*d %*d %*d %*d %*d %*d %*d %d", &download1, &upload1); fclose(fp); // 休眠5分钟 sleep(300); fp = fopen("/proc/net/dev", "r"); if(fp == NULL) { printf("Failed to open /proc/net/dev\n"); return -1; } // 跳过前两行 fgets(buf, sizeof(buf), fp); fgets(buf, sizeof(buf), fp); // 读取网卡eth0的统计信息 fgets(buf, sizeof(buf), fp); sscanf(buf + 5, "%d %*d %*d %*d %*d %*d %*d %*d %d", &download2, &upload2); fclose(fp); // 计算上传和下载的字节数 printf("Upload: %d bytes, Download: %d bytes\n", upload2 - upload1, download2 - download1); } return 0; } ``` 这段代码使用了Linux系统中的/proc文件系统来获取网卡eth0的上传和下载流量统计信息。在每个五分钟的时间间隔内,程序会计算当前的上传和下载流量,并输出统计结果。你可以根据自己的需求修改代码中的网卡名称和输出方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值