《Linux网络接口》---------struct ifreq struct ifconf
网络接口--------------struct ifconf,struct ifreq
网络相关的ioctl请求的request参数及arg地址必须指向的数据类型如下表所示:
接口 |
SIOCGIFCONF SIOCSIFADDR SIOCGIFADDR SIOCSIFBRDADDR SIOCGIFBRDADDR SIOCSIFNETMASK SIOCGIFNETMASK |
获取所有接口列表 设置接口地址 获取接口地址 设置广播地址 获取广播地址 设置子网掩码 获取子网掩码 |
Struct ifconf Struct ifreq Struct ifreq Struct ifreq Struct ifreq Struct ifreq Struct ifreq |
Ifreq结构用来配置ip地址,激活接口,配置MTU。在Linux系统中获取IP地址通常都是通过ifconfig命令来实现的,然而ifconfig命令实际是通过ioctl接口与内核通信,ifconfig命令首先打开一个socket,然后调用ioctl将request传递到内核,从而获取request请求数据。处理网络接口的许多程序沿用的初始步骤之一就是从内核获取配置在系统中的所有接口。
Struct ifreq data;
Fd = socket(AF_NET,SOCK_DGRAM,0);
< request >
Ioctl(fd,SIOCGIFADDR,&data);
struct ifconf结构体
struct ifconf{ lint ifc_len; union{ caddr_t ifcu_buf Struct ifreq *ifcu_req; }ifc_ifcu } #define ifc_buf ifc_ifcu.ifcu_buf #define ifc_req ifc_ifcu.ifcu_req |
Struct ifreq接口
Struct ifreq{ Char ifr_name[IFNAMSIZ]; 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_metric; Caddr_t ifru_data; }ifr_ifru; }; #define ifr_addr ifr_ifru.ifru_addr #define ifr_broadaddr ifr_ifru.ifru_broadadd #define ifr_hwaddr ifr_ifru_hwaddr |
对于ifconf中ifc_buf,其实就是N个ifc_req,从上面的结构体中可以看出来,通过下面两幅图可以更加明显。
接下来通过代码实现ifconfig功能,即可以查看本地的IP、MAC地址、子网掩码等,首先通过ifconfig我们可以查看本机的信息,如下所示:
接下来通过代码实现如下所示
- #include<stdlib.h>
- #include<stdio.h>
- #include<unistd.h>
- #include<net/if.h>
- #include<net/if_arp.h>
- #include<arpa/inet.h>
- #include<sys/ioctl.h>
- #include<errno.h>
- #define ETH_NAME "eth0"
- static void get_local_ip(int sock_fd);
- static void get_netmask_addr(int sock_fd);
- static void get_mac_addr(int sock_fd);
- static void get_broad_addr(int sock_fd);
- struct sockaddr_in sin;
- struct sockaddr_in netmask;
- struct sockaddr_in broad;
- struct ifreq ifr;
- unsigned char arp[6];
- int main()
- {
- int sockfd;
- //create socket
- sockfd = socket(AF_INET,SOCK_DGRAM,0);
- if(sockfd == -1)
- {
- perror("socket");
- return -1;
- }
- get_local_ip(sockfd);
- get_mac_addr(sockfd);
- get_netmask_addr(sockfd);
- get_broad_addr(sockfd);
- return 0;
- }
- static void get_local_ip(int sock_fd)
- {
- strncpy(ifr.ifr_name,ETH_NAME,IFNAMSIZ);
- ifr.ifr_name[IFNAMSIZ - 1] = 0;
- if(ioctl(sock_fd,SIOCGIFADDR,&ifr) == 0)
- {
- memcpy(&sin,&ifr.ifr_addr,sizeof(sin));
- fprintf(stdout,"eth0: %s\n",inet_ntoa(sin.sin_addr));
- }
- }
- static void get_mac_addr(int sock_fd)
- {
- if(ioctl(sock_fd,SIOCGIFHWADDR,&ifr)==0)
- {
- memcpy(arp,ifr.ifr_hwaddr.sa_data,6);
- printf("adapter hardware address %x:%x:%x:%x:%x:%x\n",arp[0],arp[1],arp[2],arp[3],arp[4],arp[5]);
- }
- }
- static void get_netmask_addr(int sock_fd)
- {
- if(ioctl(sock_fd,SIOCGIFNETMASK,&ifr)==0)
- {
- memcpy(&netmask,&ifr.ifr_netmask,sizeof(netmask));
- printf("netmask: %s\n",inet_ntoa(netmask.sin_addr));
- }
- }
- static void get_broad_addr(int sock_fd)
- {
- if(ioctl(sock_fd,SIOCGIFBRDADDR,&ifr)==0)
- {
- memcpy(&broad,&ifr.ifr_broadaddr,sizeof(broad));
- printf("broad: %s\n",inet_ntoa(broad.sin_addr));
- }
- }
所要查看的网卡名字为“eth0”;
然后创建一个SOCKET通信
static void get_local_ip(int sock_fd)函数用来获取本机IP地址,请求(request)是SIOCGIFADDR
static void get_mac_addr(int sock_fd)获取本机的MAC地址,request 是SIOCGIFHWADDR
static void get_netmask_addr(int sock_fd)获取子网掩码地址,request是SIOCGIFNETMASK
static void get_broad_addr(int sock_fd)获取广播地址,request是SIOCGIFBRDADDR
《Linux网络接口》---------struct ifreq struct ifconf相关推荐
- 获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf
http://blog.csdn.net/windeal3203/article/details/39320605 Linux 下 可以使用ioctl()函数 以及 结构体 struct ifreq ...
- struct ifconf和struct ifreq,获取网线插入状态
struct ifreq 这个结构定义在include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的 struct ifconf 通常是用来保存所有接口信息的 应用 想要获取当 ...
- 使用struct ifreq实现ifconfig
转自:http://blog.csdn.net/joker0910/article/details/7855998 ifconfig是我们查看/设定网口状态常用的命令,其实这个命令就是对一些系统函数的 ...
- struct ifreq 学习,现实ifconfig 功能
一.struct ifreq结构体 这个结构定义在/usr/include/net/if.h,用来配置和获取ip地址,掩码,MTU等接口信息的. /* Interface request struct ...
- Linux总线驱动-02: struct bus_type 结构体
http://blog.csdn.net/cppgp/article/details/6333359 本文测试系统为:Ubuntu 10.10 x86_64 2.6.35-24-generic 上节中 ...
- linux device结构体,struct device结构体
一.定义: linux/include/linux/device.h struct device { struct klist klist_children; struct klist_nod ...
- linux sock结构体,struct socket结构体详解
在内核中为什么要有struct socket结构体呢? struct socket结构体的作用是什么? 下面这个图,我觉得可以回答以上两个问题. 由这个图可知,内核中的进程可以通过使用struct ...
- typedefnbsp;struct与struct的区别
typedef struct与struct的区别 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据 ...
- struct sockaddr与struct sockaddr_in ,struct sockaddr_un的区别和联系
sockaddr struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_data[14]; ...
最新文章
- jQuery中FormData的使用
- 设置默认Browser
- TextureView+MediaPlayer实现在线短视频播放
- MaxComputeSql性能调优
- Greenplum元数据信息
- 表、栈和队列(JAVA实现)
- RubikFX:用JavaFX 3D解决魔方难题
- 行为型模型 中介者模式
- U盘硬盘等修复、维护、修理工具集合
- springboot Error executing DDL via JDBC Statement
- 累死你的不是工作方式
- 猜数字(Bulls and Cows)游戏
- canal mq数据同步
- np.partition介绍
- 9.16 a.m.小结
- 12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁
- 《Patterns, Principles, and Pract》— chapter15 Value Objects
- 任性杭州,骨感北京——面试汇总
- 「低功耗蓝牙模块」主从一体 蓝牙嗅探-助力智能门锁
- C/C++ 位域定义
热门文章
- html 怎么置顶表格,表格(Table)表头固定,内容上滚【5个实例】
- windows安装python3步骤_Windows下python3和python2安装与一起使用
- 【渝粤教育】国家开放大学2018年秋季 1137t医院管理 参考试题
- 【渝粤教育】国家开放大学2019年春季 2732土地利用规划 参考试题
- 【渝粤教育】 国家开放大学2020年春季 1079高等代数专题研究 参考试题
- [渝粤教育] 中国地质大学 婚姻与家庭法 复习题
- 【渝粤题库】陕西师范大学500018 物理实验研究 作业(专升本)
- 【渝粤题库】陕西师范大学164104 网络财务管理 作业(高起专)
- 物联网将成为第四次工业革命的基石
- mysql 内存溢出_mysql - MySQL在非常大的表上计算性能 - 堆栈内存溢出