获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf
转载请注明出处:windeal专栏
Linux 下 可以使用ioctl()函数 以及 结构体 struct ifreq
结构体struct ifconf来获取网络接口的各种信息。
ioctl
#include <sys/ioctl.h>
int ioctl(int fd, int request, ...);
: 后面的可变参数根据request而定
- struct ifconf IoCtlReq;
- ...
- ioctl( Sock, SIOCGIFCONF, &IoCtlReq )
接
口
|
SIOCGIFCONF
SIOCSIFADDR
SIOCGIFADDR
SIOCSIFFLAGS
SIOCGIFFLAGS
SIOCSIFDSTADDR
SIOCGIFDSTADDR
SIOCGIFBRDADDR
SIOCSIFBRDADDR
SIOCGIFNETMASK
SIOCSIFNETMASK
SIOCGIFMETRIC
SIOCSIFMETRIC
SIOCGIFMTU
SIOCxxx
|
获取所有接口的清单
设置接口地址
获取接口地址
设置接口标志
获取接口标志
设置点到点地址
获取点到点地址
获取广播地址
设置广播地址
获取子网掩码
设置子网掩码
获取接口的测度
设置接口的测度
获取接口MTU
(还有很多取决于系统的实现)
|
struct ifconf
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
struct ifreq
|
struct ifreq
- // if.h
- /*
- * Interface request structure used for socket
- * ioctl's. All interface ioctl's must have parameter
- * definitions which begin with ifr_name. The
- * remainder may be interface specific.
- */
- struct ifreq {
- #define IFHWADDRLEN 6
- union
- {
- char ifrn_name[IFNAMSIZ]; /* if 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 ifru_flags;
- int ifru_ivalue;
- int ifru_mtu;
- struct ifmap ifru_map;
- char ifru_slave[IFNAMSIZ]; /* Just fits the size */
- char ifru_newname[IFNAMSIZ];
- void __user * ifru_data;
- struct if_settings ifru_settings;
- } 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 ifr_settings ifr_ifru.ifru_settings /* Device/proto settings*/
ioctl(Sock, SIOCGIFNETMASK, &IfReq);//获取网络接口地址掩码
struct ifconf
- // if.h
- /*
- * Structure used in SIOCGIFCONF request.
- * Used to retrieve interface configuration
- * for machine (useful for programs which
- * must know all networks accessible).
- */
- struct ifconf {
- int ifc_len; /* size of buffer */
- union {
- char __user *ifcu_buf;
- struct ifreq __user *ifcu_req;
- } ifc_ifcu;
- };
- #define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
- #define ifc_req ifc_ifcu.ifcu_req /* array of structures */

Example:
- #include <sys/types.h>
- #include <sys/ioctl.h>
- #include <sys/socket.h>
- #include <net/if.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <netdb.h>
- #include <string.h>
- #include <fcntl.h>
- #include <string.h>
- #include <errno.h>
- typedef uint32_t uint32;
- #define MAX_IF 10
- int
- main()
- {
- struct ifreq ifVec[MAX_IF];//用来保存所有接口
- int sock = -1;
- if ( (sock = socket( AF_INET, SOCK_DGRAM, 0 )) < 0 )
- fprintf(stderr, "Error:%d, cannot open RAM;\n");
- // get if vector
- struct ifconf ioIfConf;
- ioIfConf.ifc_buf = (void *)ifVec;
- ioIfConf.ifc_len = sizeof(ifVec);
- printf("Len:%d\n", ioIfConf.ifc_len);
- if (ioctl(sock, SIOCGIFCONF, &ioIfConf) < 0 )//获取所有网络接口信息
- fprintf(stderr, "Error:%d ioctl IFCONF\n");
- printf("Len:%d\n", ioIfConf.ifc_len);// 和前面到len对比,发现ioctl修改里len到大小
- //循环打印每个网络接口到信息
- {
- struct ifreq *ifPt;
- struct ifreq *ifEndPt;
- ifPt = ifVec;
- ifEndPt = (void *)((char *)ifVec + ioIfConf.ifc_len);
- for (ifPt = ifVec; ifPt < ifEndPt; ifPt++)
- {
- struct ifreq ifReq;
- if ( ifPt->ifr_addr.sa_family != AF_INET ) {
- continue;
- }
- // Temp keepers of interface params...
- uint32 u32_addr, u32_mask;
- /* 打印ip地址 */
- char ipDotBuf[16], subnetDotBuf[16], maskDotBuf[16]; // 保存点分十进制到ip地址
- u32_addr = ((struct sockaddr_in *)&ifPt->ifr_addr)->sin_addr.s_addr;
- inet_ntop(AF_INET, &u32_addr, ipDotBuf, (socklen_t )sizeof(ipDotBuf));
- printf("IP Address: %s\n", ipDotBuf);
- /* 打印地址掩码 */
- bzero(&ifReq,sizeof(struct ifreq));
- memcpy(ifReq.ifr_name, ifPt->ifr_name, sizeof(ifReq.ifr_name));
- if (ioctl(sock, SIOCGIFNETMASK, &ifReq ) < 0){
- fprintf(stderr, "Error: %d, cannot get mask\n", errno);
- }
- else{
- u32_mask = ((struct sockaddr_in *)&ifReq.ifr_addr)->sin_addr.s_addr;
- inet_ntop(AF_INET, &u32_mask, maskDotBuf, (socklen_t )sizeof(maskDotBuf));
- printf("Mask: %s\n", maskDotBuf);
- }
- /* 打印MTU */
- bzero(&ifReq,sizeof(struct ifreq));
- memcpy(ifReq.ifr_name, ifPt->ifr_name, sizeof(ifReq.ifr_name));
- if (ioctl(sock, SIOCGIFMTU, &ifReq ) < 0){
- fprintf(stderr, "Error: %d, cannot get MTU\n", errno);
- }
- else{
- printf("SIOCGIFMTU:%d\n", ifReq.ifr_mtu);
- }
- /* 其他信息的打印方式与掩码和MTU相同 */
- }
- }
- }
- windeal@ubuntu:~/Windeal/apue$ ./exe
- Len:320
- Len:64
- IP Address: 127.0.0.1
- Mask: 255.0.0.0
- SIOCGIFMTU:16436
- IP Address: 172.17.92.198
- Mask: 255.255.254.0
- SIOCGIFMTU:1500
- windeal@ubuntu:~/Windeal/apue$
获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf的更多相关文章
- 自己动手写路由器之ioctl获取网络接口信息
最近打算写一个简单路由器,里面有用到ioctl获取网络接口信息,那就先把这部分单独拿出来说一说吧! ioctl这个函数,可以用来对特殊文件的基础设备参数进行操作,它们可以完成与打开文件描述符相关联的控 ...
- Linux获取网络接口信息
linux获取网络接口信息需要用到的函数为ioctl(),结构体struct ifreq,struct ifconf 1.ioctl()函数原型及作用 #include <sys/ioctl.h ...
- C语言笔记 08_函数指针&回调函数&字符串&结构体&位域
函数指针 函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调用函数.传递参数. 函数指针变量的声明: / ...
- Go基础3:函数、结构体、方法、接口
目录 1. 函数 1.1 函数返回值 同一种类型返回值 带变量名的返回值 函数中的参数传递 函数变量 1.2 匿名函数--没有函数名字的函数 在定义时调用匿名函数 将匿名函数赋值给变量 匿名函数用作回 ...
- 【AT91SAM3S】SAM3S-EK Demo工程中,LCD驱动程序的加载(函数指针结构体)
为了调试LCD,在英倍特的板子上烧Atmel的sam3s-ek_demo_1.4_source示例代码.LCD显示正常了,却找不到LCD的驱动究竟在哪. 花了好久,追踪到了这个执行过程. 进入main ...
- go 学习 (三):函数 & 指针 & 结构体
一.函数 函数声明 // 声明语法 func funcName (paramName paramType, ...) (returnType, returnType...) { // do somet ...
- struct--------构造函数对结构体初始化的影响
struct--------构造函数对结构体初始化的影响. 没有构造函数时使用如下: struct ClassBook{ int number; int age; }; int main() { ...
- 【Unity Shader】---常用帮助函数、结构体和全局变量
[Unity Shader]---常用帮助函数.结构体和全局变量 一.内置包含文件 Unity中有类似于C++的包含文件.cginc,在编写Shader时我们可以使用#include指令把这些文件包含 ...
- <algorithm>里的sort函数对结构体排序
题目描述 每天第一个到机房的人要把门打开,最后一个离开的人要把门关好.现有一堆杂乱的机房签到.签离记录,请根据记录找出当天开门和关门的人. 输入描述: 每天的记录在第一行给出记录的条目数M (M &g ...
随机推荐
- TCP/IP 传输原理
TCP传输原理简单说明 TCP传输需要经过3次握手4次挥手. 三次握手 当客户端向服务端进行连接时,会发送一个SYN报文,请求服务端监听端口,服务端确认请求后,会向客户端发送ACK确认,客户端 ...
- 20145327 《Java程序设计》第一周学习总结
20145327 <Java程序设计>第一周学习总结 教材学习内容总结 Java根据领域不同,区分为Java SE.Java EE与Java ME三大平台.Java SE是各应用平台的基础 ...
- Python3.6 安装、后续终端pip 安装模块命令
1. 下载安装包 https://www.python.org/ftp/python/3.6.4/python-3.6.4-amd64.exe 2. 安装python3.6 增加环境变量(打钩.红框很 ...
- Spring IOC 源码解析(持续)
如何查看源码 Spring源码下载https://github.com/spring-projects/spring-framework/tags?after=v3.1.0.RC1 eclipse关联 ...
- mysql索引的建立和使用
转自[http://www.cnblogs.com/mywebname/articles/555696.html] 一.索引的概念 索引就是加快检索表中数据的方法.数据库的索引类似于书籍 ...
- Anaconda 环境中使用pip安装时候出现的一些问题
author:pprp date:18/8/12 --- 1. AttributeError: Module Pip has no attribute 'main' solution:降低pip的版本 ...
- valgrind的memchk和callgrind
一.安装valgrind 安装valgrind,正常的三部曲configure/make/make install就行. 二.memchk使用 1.执行命令 [root@10g-host4 tools ...
- git 提交某个内容
git add 你所添加的文件或者文件夹 git commit git push
- Browserify命令行参数
–outfile, -o: browserify日志打印到文件 –require, -r: 绑定模块名或文件,用逗号分隔 –entry, -e: 应用程序的入口 –ignore, -i: 省略输出 – ...
- 03_MySQL DQL_排序查询
#进阶3:排序查询/*语法: select 查询列表 from 表名 [where 筛选条件] order by 排序列表 [asc|desc] 特点: 1.asc升序,desc降序, 如果都不写,默 ...