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

本文介绍了如何使用C语言在Linux系统中实现类似ifconfig命令的功能,获取网卡的接收和发送流量。关键在于读取/proc/net/dev文件中的信息,该文件实时更新网络接口的统计数据。博主分享了实现代码,并展示了运行结果。
摘要由CSDN通过智能技术生成
               

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

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

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

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


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

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

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

#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言中,可以使用系统库函数和网络编程库函数来实现ifconfig的功能。以下是一个基本的示例代码,用于获取本地网络接口信息: ```c #include <stdio.h> #include <stdlib.h> #include <sys/ioctl.h> #include <net/if.h> #include <string.h> #include <netinet/in.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { struct ifreq ifr; struct ifconf ifc; char buf[1024]; int success = 0; int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if (sock == -1) { printf("Error: could not create socket\n"); exit(1); } ifc.ifc_len = sizeof(buf); ifc.ifc_buf = buf; if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { printf("Error: could not get network interface configuration\n"); exit(1); } struct ifreq *ifr_ptr = ifc.ifc_req; for (int i = ifc.ifc_len / sizeof(struct ifreq); i > 0; i--) { if (strcmp(ifr_ptr->ifr_name, "lo") != 0) { memcpy(&ifr, ifr_ptr, sizeof(struct ifreq)); if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) { if (ifr.ifr_flags & IFF_UP) { printf("%s: UP\n", ifr.ifr_name); if (ioctl(sock, SIOCGIFADDR, &ifr) == 0) { struct sockaddr_in *addr_ptr = (struct sockaddr_in*)&ifr.ifr_addr; char *addr = inet_ntoa(addr_ptr->sin_addr); printf("\tIP Address: %s\n", addr); } if (ioctl(sock, SIOCGIFNETMASK, &ifr) == 0) { struct sockaddr_in *addr_ptr = (struct sockaddr_in*)&ifr.ifr_netmask; char *addr = inet_ntoa(addr_ptr->sin_addr); printf("\tNetmask: %s\n", addr); } if (ioctl(sock, SIOCGIFMTU, &ifr) == 0) { printf("\tMTU: %d\n", ifr.ifr_mtu); } if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) { unsigned char *mac = (unsigned char*)ifr.ifr_hwaddr.sa_data; printf("\tMAC Address: %02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); } success = 1; } } else { printf("Error: could not get network interface flags\n"); } printf("\n"); } ifr_ptr++; } if (!success) { printf("Error: could not find any active network interfaces\n"); } close(sock); return 0; } ``` 该代码将枚举系统上所有的网络接口,并打印它们的IP地址、子网掩码、MAC地址和MTU(最大传输单元)。要运行此程序,请在终端中使用以下命令: ``` gcc ifconfig.c -o ifconfig && sudo ./ifconfig ``` 请注意,需要使用sudo权限才能访问网络接口信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值