功能介绍

  • 获取 Linux 系统网卡数量(包括环回)
  • 遍历每张网卡
  • 打印网卡的 名称、MAC 地址、IP 地址、广播地址、子网掩码

源码

interface_info.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>#include <net/if.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>int sock_get_local_info(void)
{int fd;int interfaceNum = 0;struct ifreq buf[16];struct ifconf ifc;struct ifreq ifrcopy;char mac[16] = {0};char ip[32] = {0};char broadAddr[32] = {0};char subnetMask[32] = {0};if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("socket");close(fd);return -1;}ifc.ifc_len = sizeof(buf);ifc.ifc_buf = (caddr_t)buf;if (!ioctl(fd, SIOCGIFCONF, (char *)&ifc)) {interfaceNum = ifc.ifc_len / sizeof(struct ifreq);printf("interface num = %d\n", interfaceNum);while (interfaceNum-- > 0) {printf("\ndevice name: %s\n", buf[interfaceNum].ifr_name);//ignore the interface that not up or not runingifrcopy = buf[interfaceNum];if (ioctl(fd, SIOCGIFFLAGS, &ifrcopy)) {printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);close(fd);return -1;}//get the mac of this interfaceif (!ioctl(fd, SIOCGIFHWADDR, (char *)(&buf[interfaceNum]))) {memset(mac, 0, sizeof(mac));snprintf(mac, sizeof(mac), "%02x%02x%02x%02x%02x%02x",(unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[0],(unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[1],(unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[2],(unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[3],(unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[4],(unsigned char)buf[interfaceNum].ifr_hwaddr.sa_data[5]);printf("device mac: %s\n", mac);} else {printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);close(fd);return -1;}//get the IP of this interfaceif (!ioctl(fd, SIOCGIFADDR, (char *)&buf[interfaceNum])) {snprintf(ip, sizeof(ip), "%s",(char *)inet_ntoa(((struct sockaddr_in *)&(buf[interfaceNum].ifr_addr))->sin_addr));printf("device ip: %s\n", ip);} else {printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);close(fd);return -1;}//get the broad address of this interfaceif (!ioctl(fd, SIOCGIFBRDADDR, &buf[interfaceNum])) {snprintf(broadAddr, sizeof(broadAddr), "%s",(char *)inet_ntoa(((struct sockaddr_in *)&(buf[interfaceNum].ifr_broadaddr))->sin_addr));printf("device broadAddr: %s\n", broadAddr);} else {printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);close(fd);return -1;}//get the subnet mask of this interfaceif (!ioctl(fd, SIOCGIFNETMASK, &buf[interfaceNum])) {snprintf(subnetMask, sizeof(subnetMask), "%s",(char *)inet_ntoa(((struct sockaddr_in *)&(buf[interfaceNum].ifr_netmask))->sin_addr));printf("device subnetMask: %s\n", subnetMask);} else {printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);close(fd);return -1;}}} else {printf("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__, __LINE__);close(fd);return -1;}close(fd);return 0;
}int main(int argc, char *argv[])
{sock_get_local_info();return EXIT_SUCCESS;
}

编译

gcc interface_info.c -o interface_info.out -Wall

运行

$ ./interface_info.out
interface num = 2device name: enp0s3
device mac: 08002738fcd0
device ip: 192.168.31.223
device broadAddr: 192.168.31.255
device subnetMask: 255.255.255.0device name: lo
device mac: 000000000000
device ip: 127.0.0.1
device broadAddr: 0.0.0.0
device subnetMask: 255.0.0.0

和 ifconfig 命令显示的信息一致

$ ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.31.223  netmask 255.255.255.0  broadcast 192.168.31.255ether 08:00:27:38:fc:d0  txqueuelen 1000  (以太网)RX packets 183199  bytes 179974182 (179.9 MB)RX errors 0  dropped 193  overruns 0  frame 0TX packets 68178  bytes 7018396 (7.0 MB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0inet6 ::1  prefixlen 128  scopeid 0x10<host>loop  txqueuelen 1000  (本地环回)RX packets 4025  bytes 399305 (399.3 KB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 4025  bytes 399305 (399.3 KB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

获取 Linux 系统所有网卡信息相关推荐

  1. 验证:获取linux系统的网卡信息

    有时候,总想验证一些奇怪的想法,干脆就写下来,以备后查. 想法:获取linux系统的网卡信息(1)网卡名称 (2)IPv4 (3)IPv6 (4)MAC地址 (5)是否回环地址 (6)是否物理网卡 ( ...

  2. python相关linux_Python实现获取Linux系统基本信息

    Python实现获取Linux系统基本信息,获取信息如下: 主机名 系统版本 系统内核版本 总内存 CPU生厂商 CPU总核心数 服务器生厂商 服务器序列号 各网卡IP,MAC和网卡名信息 实现代码如 ...

  3. 使用Python获取Linux系统的各种信息

    From: http://www.jb51.net/article/52058.htm 这篇文章主要介绍了使用Python获取Linux系统的各种信息,例如系统类型.CPU信息.内存信息.块设备等,需 ...

  4. 获取linux系统序列号

    项目中需要获取服务器系统序列号,方法如下: /*** Method for get Linux Machine MotherBoard Serial Number** @return*/public ...

  5. 通过sysinfo获取Linux系统状态信息

      系统运行状态信息是我们关注的重点,通过当前系统的输出信息,如内存大小.进程数量.运行时间等,以便分析CPU负载.软硬件资源占用情况,确保系统高效和稳定.Linux系统中,提供sysinfo以获取相 ...

  6. linux怎么静态改为自动获取,Linux系统下设置静态IP或自动获取动态IP的简单方法...

    linux下为机器设置静态ip地址: 复制代码代码如下: vim /etc/sysconfig/network-scripts/ifcfg-eth0 修改这个文件内容如下形式: 复制代码代码如下: # ...

  7. 获取linux系统编码,Android获取IMEI码

    相比大家都知道,每部手机都有一个属于自己的字符串,这个字符串是全球唯一的:即使相同品牌,相同型号,它们彼此也不会雷同:这个码就是IEMI码. 有了IMEI码,我们就能很方便的区分出每一台机器,区分出机 ...

  8. linux系统查询网卡信息,Linux下如何查询电脑中的网卡详细信息呢?

    摘要: 下文讲述Linux操作系统下查看网卡详细信息的方法分享,如下所示: 实现环境: CentOS 实现思路: 使用ifconfig命令即可查看网卡信息,如下所示: [root@localhost ...

  9. 周期获取Linux系统内存

    rvolume.h中代码: 1 #ifndef VOLUME_H 2 #define VOLUME_H 3 #include <QtCore/QCoreApplication> 4 #in ...

最新文章

  1. Hibernate二级缓存与查询缓存的组合探究
  2. tensorflow中tf.random_normal和tf.truncated_normal的区别
  3. gateway动态路由_Java如何用Spring Cloud奇淫小技巧 来使用gateway作为服务网管
  4. python classmethod函数_在python中使用与instance和classmethod相同的函数
  5. Canalys:2021年第四季度苹果智能手机出货量占全球总量的22%
  6. 疫情之下困难的设备维护工作该如何解决? ​
  7. Ubuntu16.04版安装VMwareTools的步骤和没法挂载目录问题的解决
  8. pcie握手机制_图解PCIE原理(从软件角度)
  9. torch 深度学习(5)
  10. arduino通过串口监视器读取一行字符
  11. 高级c语言程序设计视频教程,C语言高级编程视频教程
  12. Cmake编译时无法打开包括文件: “pthread.h”
  13. uniapp微信小程序订阅消息发送服务通知--超详细
  14. matlab imrotate中心,MATLAB imrotate函数的用法
  15. Pygame——创建游戏地图
  16. LabView的简单例题,尽量做到一题多解
  17. 错误 C1083 无法打开源文件
  18. Mac上Android手机无法连接解决方案
  19. 以太网标准-802.3各个标准简介
  20. 什么是Cloud Computing?

热门文章

  1. 视频教程-2017年软上半年软考网络工程师级别考前冲刺之第三天-软考
  2. 朋友圈实现自动点赞的软件思路与部分代码分享
  3. 数据分析与大数据分析的区别
  4. 数学建模方法—【03】拟合优度的计算(python计算)
  5. 地表反射率影响因素_常被忽视的地面反射率对光伏设计的影响
  6. 机加行业MES解决方案,助力企业打造数字化透明车间
  7. 人工智能数字信号图像处理演示系统
  8. 【coderwhy前端笔记 - 阶段一 HTML+CSS】(一)HTML
  9. 填平片上系统设计和制造供应链中的沟通鸿沟
  10. Android 10 已无法获取SN序列号