linux 获取网卡接口信息

  • 获取本机所有网卡名称
  • struct ifreq
  • ioctl 头文件
  • 获取网卡信息

获取本机所有网卡名称

// /usr/include/net/if.h, 头文件 <net/if.h>
// 返回是一个if_nameindex 指针
extern struct if_nameindex *if_nameindex(void) __THROW;
// 释放
extern void if_freenameindex(struct if_nameindex *__ptr) __THROW;
struct if_nameindex {unsigned int if_index; /* 1, 2, ... */char *if_name;         /* 网卡名 null terminated name: "eth0", ... */
};

使用

#include <net/if.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(int argc, char *argv[])
{struct if_nameindex *interfaces, *i;interfaces = if_nameindex();for (i = interfaces; i->if_index && i->if_name; i++)printf("%u: %s\n", i->if_index, i->if_name);if_freenameindex(interfaces);
}

可以通过 ifconfig -a 查看

struct ifreq

获取网卡的信息需要通过ioctl

// /usr/include/net/if.h
// Interface request structure used for socket ioctl's.
struct ifreq {#define IFHWADDRLEN 6
#define IFNAMSIZ    IF_NAMESIZEunion {char ifrn_name[IFNAMSIZ]; /* Interface name, e.g. "en0".  */} ifr_ifrn;union {struct sockaddr ifru_addr;struct sockaddr ifru_dstaddr;struct sockaddr ifru_broadaddr;struct sockaddr ifru_netmask;struct sockaddr ifru_hwaddr;short int ifru_flags;int ifru_ivalue;int ifru_mtu;struct ifmap ifru_map;char ifru_slave[IFNAMSIZ]; /* Just fits the size */char ifru_newname[IFNAMSIZ];__caddr_t ifru_data;} ifr_ifru;
};
#define ifr_name         ifr_ifrn.ifrn_name      /* interface name  */
#define ifr_hwaddr       ifr_ifru.ifru_hwaddr    /* MAC address         */
#define ifr_addr         ifr_ifru.ifru_addr      /* address     */
#define ifr_dstaddr      ifr_ifru.ifru_dstaddr   /* other end of p-p lnk    */
#define ifr_broadaddr    ifr_ifru.ifru_broadaddr /* broadcast address   */
#define ifr_netmask      ifr_ifru.ifru_netmask   /* interface net mask  */
#define ifr_flags        ifr_ifru.ifru_flags     /* flags       */
#define ifr_metric       ifr_ifru.ifru_ivalue    /* metric      */
#define ifr_mtu          ifr_ifru.ifru_mtu       /* mtu         */
#define ifr_map          ifr_ifru.ifru_map       /* device map      */
#define ifr_slave        ifr_ifru.ifru_slave     /* slave device        */
#define ifr_data         ifr_ifru.ifru_data      /* for use by interface    */
#define ifr_ifindex      ifr_ifru.ifru_ivalue    /* interface index      */
#define ifr_bandwidth    ifr_ifru.ifru_ivalue    /* link bandwidth  */
#define ifr_qlen         ifr_ifru.ifru_ivalue    /* queue length        */
#define ifr_newname      ifr_ifru.ifru_newname   /* New name        */
#define _IOT_ifreq       _IOT(_IOTS(char), IFNAMSIZ, _IOTS(char), 16, 0, 0)
#define _IOT_ifreq_short _IOT(_IOTS(char), IFNAMSIZ, _IOTS(short), 1, 0, 0)
#define _IOT_ifreq_int   _IOT(_IOTS(char), IFNAMSIZ, _IOTS(int), 1, 0, 0)//  SIOCGIFCONF ioctl 调用使用
struct ifconf {int ifc_len; /* Size of buffer.  */union {__caddr_t ifcu_buf;struct ifreq *ifcu_req;} ifc_ifcu;
};
#define ifc_buf     ifc_ifcu.ifcu_buf /* Buffer address.  */
#define ifc_req     ifc_ifcu.ifcu_req /* Array of structures.  */
#define _IOT_ifconf _IOT(_IOTS(struct ifconf), 1, 0, 0, 0, 0) /* not right */

ioctl 头文件

// 头文件: <sys/ioctl.h>
/* Get the list of `ioctl' requests and related constants.  */
#include <bits/ioctls.h>
/* Define some types used by `ioctl' requests.  */
#include <bits/ioctl-types.h>
// linux 可能包含的默认配置
#include <sys/ttydefaults.h>extern int ioctl (int __fd, unsigned long int __request, ...) __THROW;

<bits/ioctls.h> 头文件部分内容

/* Socket configuration controls. */
#define SIOCGIFNAME 0x8910      /* get iface name       */
#define SIOCSIFLINK 0x8911      /* set iface channel        */
#define SIOCGIFCONF 0x8912      /* get iface list       */
#define SIOCGIFFLAGS    0x8913      /* get flags            */
#define SIOCSIFFLAGS    0x8914      /* set flags            */
#define SIOCGIFADDR 0x8915      /* get PA address       */
#define SIOCSIFADDR 0x8916      /* set PA address       */
#define SIOCGIFDSTADDR  0x8917      /* get remote PA address    */
#define SIOCSIFDSTADDR  0x8918      /* set remote PA address    */
#define SIOCGIFBRDADDR  0x8919      /* get broadcast PA address */
#define SIOCSIFBRDADDR  0x891a      /* set broadcast PA address */
#define SIOCGIFNETMASK  0x891b      /* get network PA mask      */
#define SIOCSIFNETMASK  0x891c      /* set network PA mask      */
#define SIOCGIFMETRIC   0x891d      /* get metric           */
#define SIOCSIFMETRIC   0x891e      /* set metric           */
#define SIOCGIFMEM  0x891f      /* get memory address (BSD) */
#define SIOCSIFMEM  0x8920      /* set memory address (BSD) */
#define SIOCGIFMTU  0x8921      /* get MTU size         */
#define SIOCSIFMTU  0x8922      /* set MTU size         */
#define SIOCSIFNAME 0x8923      /* set interface name       */
#define SIOCSIFHWADDR   0x8924      /* set hardware address     */
#define SIOCGIFENCAP    0x8925      /* get/set encapsulations       */
#define SIOCSIFENCAP    0x8926
#define SIOCGIFHWADDR   0x8927      /* Get hardware address     */
#define SIOCGIFSLAVE    0x8929      /* Driver slaving support   */
#define SIOCSIFSLAVE    0x8930
#define SIOCADDMULTI    0x8931      /* Multicast address lists  */
#define SIOCDELMULTI    0x8932
#define SIOCGIFINDEX    0x8933      /* name -> if_index mapping  */
#define SIOGIFINDEX SIOCGIFINDEX    /* misprint compatibility :-)   */
#define SIOCSIFPFLAGS   0x8934      /* set/get extended flags set   */
#define SIOCGIFPFLAGS   0x8935
#define SIOCDIFADDR 0x8936      /* delete PA address        */
#define SIOCSIFHWBROADCAST  0x8937  /* set hardware broadcast addr  */
#define SIOCGIFCOUNT    0x8938      /* get number of devices */
#define SIOCGIFBR   0x8940      /* Bridging support     */
#define SIOCSIFBR   0x8941      /* Set bridging options     */
#define SIOCGIFTXQLEN   0x8942      /* Get the tx queue length  */
#define SIOCSIFTXQLEN   0x8943      /* Set the tx queue length  */

获取网卡信息

#include <fcntl.h>
#include <net/if.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#define MAXN 10int main(int argc, char *argv[])
{struct ifreq interfaces[MAXN];// ioctl 调用需要socket 对象int sock = socket(AF_INET, SOCK_DGRAM, 0);// get if vectorstruct ifconf ifconf = {.ifc_len = sizeof(interfaces),.ifc_req = interfaces,};//获取所有网络接口信息ioctl(sock, SIOCGIFCONF, &ifconf);int num = ifconf.ifc_len/sizeof(struct ifreq);printf("interfaces nums = %d\n",num);struct ifreq *i = interfaces;char buf[64];for (int j=0; j<num; ++j,i++) {printf("[%d]:%s: ",j+1,i->ifr_name);ioctl(sock, SIOCGIFFLAGS,i);printf("flags=%d<> ",i->ifr_mtu);ioctl(sock, SIOCGIFMTU,i);printf("mtu %u\n",i->ifr_ifru.ifru_flags?:65536);ioctl(sock, SIOCGIFADDR,i);inet_ntop(AF_INET, &(((struct sockaddr_in *)&(i->ifr_addr))->sin_addr.s_addr), buf, sizeof(buf));printf("\tinet: %s ", buf);ioctl(sock, SIOCGIFNETMASK,i);inet_ntop(AF_INET, &(((struct sockaddr_in *)&(i->ifr_netmask))->sin_addr.s_addr), buf, sizeof(buf));printf("netmask: %s ", buf);ioctl(sock, SIOCGIFBRDADDR,i);inet_ntop(AF_INET, &(((struct sockaddr_in *)&(i->ifr_broadaddr))->sin_addr.s_addr), buf, sizeof(buf));printf("broadcast: %s\n", buf);printf("\n");}
}

linux 获取网卡接口信息相关推荐

  1. linux下通过Python代码实现获取硬件接口信息

    linux下通过Python代码实现获取硬件接口信息 1.CPU架构 Python中,platform模块给提供了很多方法去获取操作系统的信息. touch cpu.py vi cpu.py #编辑内 ...

  2. linux临时配置mac地址,Linux获取网卡型号、mac地址、修改IP地址的几种方法

    1.获取所有有(无)网卡型号 方法一.ifconfig 用法:ifconfig | grep | cut -d ':' -f 1 ubuntu root@ubuntu:~# ifconfig | gr ...

  3. Linux网卡模块,linux查看网卡驱动模块信息

    linux查看网卡驱动模块信息 来源:互联网 作者:佚名 时间:2015-03-19 09:23 1.查看网卡使用的驱动[root@slavetwo~]#ethtool-iem1driver:tg3v ...

  4. linux如何获取网卡计数信息,Linux下如何获取网卡信息

    有时候,写程序的时候需要获取计算机的网络信息,比如IP地址.电脑名称.DNS等信息.IP地址和电脑名称是比较容易获取到的,而要想获取地址掩码.DNS.网关等信息就有些麻烦了. 在Windows下我们一 ...

  5. linux获取图标接口,Linux ioctl接口

    ioctl函数 本函数影响由fd参数引用的一个打开的文件. #include int ioctl( int fd, int request, .../* void *arg */ ); 返回0:成功- ...

  6. linux查询网卡bdf信息,Linux获取pci设备的厂商号、设备号、class号

    要描述一个pci设备,就需要知道设备的厂商号(venderId).设备号(devId)和class号.那么,在Linux系统中,如何获取这三个数据呢? 既然是一个pci设备,那么首先就得知道BDF-- ...

  7. linux获取网卡协议地址,读取linux下的网络设备的mac地址与发送原始数据包 (2011-11-23 20:11)...

    一:linux下的网络设备 linux的网络设备信息都在/proc/net/dev,从这里我们可以得到所有网卡的名字,如eth0, eth1等等 root@dlrc-desktop:/home/dlr ...

  8. 获取linux详细信息,Linux 获取网口详细信息

    一般来说,研究 ifconfig.c 源代码就可以达到目的了. 但是Linux已经提供了比较方便的获取网口信息的方式: [philip@catonbj ~]$ cat /sys/class/net/e ...

  9. snmpwalk 获取端口流量_snmp获取网卡流量信息

    使用SNMPRFC1213-mib定义进行流量分析 使用snmp管理网络设备,*unix下常用net-snmp的snmpwalk,snmpget等,要得到网络的相关信息,可通过提取RFC1213- m ...

最新文章

  1. 一个互联网「打工人」的卑微一天
  2. 【HDU - 4635】Strongly connected(缩点,新图性质,建图,Tarjan求强连通分量)
  3. gcc编译c文件 python.h 未找到
  4. IntelliJ IDEA如何build path
  5. java基于springboot校园餐厅订餐管理系统
  6. 【全网最全面C语言教程】C语言从入门到精通
  7. 5年没发论文,读博想放弃?中科大博导万字自述:曾连收13封拒稿信...
  8. php网站 视频马赛克,给视频打马赛克的软件 如何在视频上打马赛克 怎样给视频的局部打马赛克...
  9. mac开发php集成环境
  10. JPA语法大全 特别是JPA的不等于
  11. java 定义泛型方法_Java中泛型方法的定义
  12. Stack Frame JAVA运行时数据区域之栈帧
  13. ambari mysql 开机自动启动_ambari的服务启动顺序如何设置
  14. 素数五个为一行的_帕斯卡三角形与素数
  15. Unity网格编程篇(四) 三维温度图、热力图
  16. Golang学习日志 ━━ 调用系统默认浏览器打开指定链接(全平台)
  17. FastDFS文件上传和下载(java代码实现)
  18. 阿古斯机器人_燃烧王座:暗牧神器新语音暗示虚空之力
  19. 医学图像开源数据集汇总
  20. 转录组助力HIV-1病毒感染机制研究新成果

热门文章

  1. ARCore之路:解决 ARCore Install Preview 即时预览APP 中弹出 The device does not support AR
  2. 西门子1200PLC与手机TCP通信
  3. 20220426现代数学前沿概览——碎片记
  4. red hat 安装redis
  5. python百元买鸡问题_用python解决数学题——100块买100只鸡
  6. 我去蔚来试车了。。。
  7. 体系认证服务认证产品认证的相同点与不同点
  8. quartus安装教程
  9. 带孩子们做环球旅行的读后感_带着孩子必须要做的5件事,你做了几件
  10. 浏览器 JavaScript 上传文件 笔记