linux 获取网卡接口信息
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 获取网卡接口信息相关推荐
- linux下通过Python代码实现获取硬件接口信息
linux下通过Python代码实现获取硬件接口信息 1.CPU架构 Python中,platform模块给提供了很多方法去获取操作系统的信息. touch cpu.py vi cpu.py #编辑内 ...
- linux临时配置mac地址,Linux获取网卡型号、mac地址、修改IP地址的几种方法
1.获取所有有(无)网卡型号 方法一.ifconfig 用法:ifconfig | grep | cut -d ':' -f 1 ubuntu root@ubuntu:~# ifconfig | gr ...
- Linux网卡模块,linux查看网卡驱动模块信息
linux查看网卡驱动模块信息 来源:互联网 作者:佚名 时间:2015-03-19 09:23 1.查看网卡使用的驱动[root@slavetwo~]#ethtool-iem1driver:tg3v ...
- linux如何获取网卡计数信息,Linux下如何获取网卡信息
有时候,写程序的时候需要获取计算机的网络信息,比如IP地址.电脑名称.DNS等信息.IP地址和电脑名称是比较容易获取到的,而要想获取地址掩码.DNS.网关等信息就有些麻烦了. 在Windows下我们一 ...
- linux获取图标接口,Linux ioctl接口
ioctl函数 本函数影响由fd参数引用的一个打开的文件. #include int ioctl( int fd, int request, .../* void *arg */ ); 返回0:成功- ...
- linux查询网卡bdf信息,Linux获取pci设备的厂商号、设备号、class号
要描述一个pci设备,就需要知道设备的厂商号(venderId).设备号(devId)和class号.那么,在Linux系统中,如何获取这三个数据呢? 既然是一个pci设备,那么首先就得知道BDF-- ...
- linux获取网卡协议地址,读取linux下的网络设备的mac地址与发送原始数据包 (2011-11-23 20:11)...
一:linux下的网络设备 linux的网络设备信息都在/proc/net/dev,从这里我们可以得到所有网卡的名字,如eth0, eth1等等 root@dlrc-desktop:/home/dlr ...
- 获取linux详细信息,Linux 获取网口详细信息
一般来说,研究 ifconfig.c 源代码就可以达到目的了. 但是Linux已经提供了比较方便的获取网口信息的方式: [philip@catonbj ~]$ cat /sys/class/net/e ...
- snmpwalk 获取端口流量_snmp获取网卡流量信息
使用SNMPRFC1213-mib定义进行流量分析 使用snmp管理网络设备,*unix下常用net-snmp的snmpwalk,snmpget等,要得到网络的相关信息,可通过提取RFC1213- m ...
最新文章
- 一个互联网「打工人」的卑微一天
- 【HDU - 4635】Strongly connected(缩点,新图性质,建图,Tarjan求强连通分量)
- gcc编译c文件 python.h 未找到
- IntelliJ IDEA如何build path
- java基于springboot校园餐厅订餐管理系统
- 【全网最全面C语言教程】C语言从入门到精通
- 5年没发论文,读博想放弃?中科大博导万字自述:曾连收13封拒稿信...
- php网站 视频马赛克,给视频打马赛克的软件 如何在视频上打马赛克 怎样给视频的局部打马赛克...
- mac开发php集成环境
- JPA语法大全 特别是JPA的不等于
- java 定义泛型方法_Java中泛型方法的定义
- Stack Frame JAVA运行时数据区域之栈帧
- ambari mysql 开机自动启动_ambari的服务启动顺序如何设置
- 素数五个为一行的_帕斯卡三角形与素数
- Unity网格编程篇(四) 三维温度图、热力图
- Golang学习日志 ━━ 调用系统默认浏览器打开指定链接(全平台)
- FastDFS文件上传和下载(java代码实现)
- 阿古斯机器人_燃烧王座:暗牧神器新语音暗示虚空之力
- 医学图像开源数据集汇总
- 转录组助力HIV-1病毒感染机制研究新成果