自己动手写路由器之ioctl获取网络接口信息

简介: 最近打算写一个简单路由器,里面有用到ioctl获取网络接口信息,那就先把这部分单独拿出来说一说吧! ioctl这个函数,可以用来对特殊文件的基础设备参数进行操作,它们可以完成与打开文件描述符相关联的控制功能。

最近打算写一个简单路由器,里面有用到ioctl获取网络接口信息,那就先把这部分单独拿出来说一说吧!

ioctl这个函数,可以用来对特殊文件的基础设备参数进行操作,它们可以完成与打开文件描述符相关联的控制功能。在程序启动时获得主机上所有接口的信息: 接口的地址、接口是否支持广播、是否支持多播等等。成功返回0,出错则返回-1。

本文里只是单独对获取网络接口信息部分讲解。

先列出一些本文里ioctl的相关ioctl 请求的request 参数以及arg 地址必须指向的数据类型:

request参数  相关说明 指向数据类型
SIOCGIFCONF 获取所有接口信息 struct ifconf
SIOCGIFADDR 获取接口地址 struct ifreq
SIOCGIFFLAGS 获取接口状态 struct ifreq
SIOCGIFBRDADDR 获取广播地址 struct ifreq
SIOCGIFNETMASK       获取子网掩码 struct ifreq

接下来,就开始利用ioctl以及其参数来获取网络接口的信息了。

直接附上代码,详情请看注释:

 

复制代码
 1 int main()
 2 {//想要获取当前网口网线插入状态,需要用到ifreq结构体,获取网卡的信息,然后socket结合网卡驱动的ioctl,就可以得到与网线插入状态相关的数据。
 3     int number;                 
 4     char *tmpbuf;               
 5     struct ifconf ifc;          //用来保存所有接口信息的   
 6     struct ifreq buf[16];       //这个结构定义在net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息
 7     ifc.ifc_len = sizeof(buf);
 8     ifc.ifc_buf = (caddr_t)buf;
 9 
10     int sockfd;
11     if(-1 == socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL)))     
12     {
13         perror("socket build !");
14         return 1;
15     } 
16     if(-1 == ioctl(sockfd,SIOCGIFCONF,(char *)&ifc))//SIOCGIFCONF用来获取所有配置接口的信息,将所获取的信息保存到ifc里。
17     {
18         perror("SIOCGIFCONF !");
19         return 1;
20     }
21     
22     number = ifc.ifc_len / sizeof(struct ifreq);
23     printf("the interface number is %d \n",number);
24     int tmp;
25     for(tmp = number;tmp > 0;tmp--)
26     {
27         printf("the interface name is %s\n",buf[tmp].ifr_name);
28 
29         /* 接口的状态信息获取 */
30         if(0 == ioctl(sockfd,SIOCGIFFLAGS,(char *)&buf[tmp]))
31         { 
32             if(IFF_UP == buf[tmp].ifr_flags)
33                 printf("UP\n");
34             else 
35                 printf("DOWN");
36         } 
37 
38         /* IP地址的获取 */
39         if(0 == ioctl(sockfd,SIOCGIFADDR,(char *)&buf[tmp]))
40         {
41             tmpbuf = (char *)inet_ntoa(((struct sockaddr_in*) (&buf[tmp].ifr_addr))->sin_addr);
42             printf("IPAdress :%s \n",tmpbuf);
43         }   
44 
45         /* 子网掩码的获取 */
46         if(0 == ioctl(sockfd,SIOCGIFNETMASK,(char *)&buf[tmp]))   
47         {
48             tmpbuf = (char *)inet_ntoa(((struct sockaddr_in*) (&buf[tmp].ifr_addr))->sin_addr);
49             printf("netmask:%s \n",tmpbuf);
50         }  
51 
52         /* 广播地址的获取 */
53         if(0 == ioctl(sockfd,SIOCGIFBRDADDR,(char *)&buf[tmp]))
54         {
55             tmpbuf = (char *)inet_ntoa(((struct sockaddr_in*)(&buf[tmp].ifr_addr))->sin_addr);
56             printf("broadcast address:%s \n",tmpbuf);
57         } 
58 
59         /* MAC地址的获取 */
60         if(0 == ioctl(sockfd,SIOCGIFHWADDR,(char *)&buf[tmp]))
61         {
62  printf("MAC:%02x:%02x:%02x:%02x:%02x:%02x\n\n",
63                     (unsigned char) buf[tmp].ifr_hwaddr.sa_data[0],
64                     (unsigned char) buf[tmp].ifr_hwaddr.sa_data[1],
65                     (unsigned char) buf[tmp].ifr_hwaddr.sa_data[2],
66                     (unsigned char) buf[tmp].ifr_hwaddr.sa_data[3],
67                     (unsigned char) buf[tmp].ifr_hwaddr.sa_data[4],
68                     (unsigned char) buf[tmp].ifr_hwaddr.sa_data[5]);
69         } 
70     }
71 }
复制代码

 

 

在驱动程序中实现的ioctl函数体内,实际上是有一个switch{case}结构的,每一个case对应一个命令码,做出一些相应的操作。

下面附上ioctl全参数多对应的命令码的功能的链接:

http://riverzhou2000.blog.163.com/blog/static/105403248201183025729615/

ioctl这个函数还有很多其它的功能,有兴趣的朋友可以问度娘,这里就不加详述了!

目录
相关文章
|
14天前
|
网络协议 Linux
在Linux中,管理和配置网络接口
在Linux中管理网络接口涉及多个命令,如`ifconfig`(在新版本中被`ip`取代)、`ip`(用于网络设备配置)、`nmcli`(NetworkManager的CLI工具)、`nmtui`(文本界面配置)、`route/ip route`(处理路由表)、`netstat/ss`(显示网络状态)和`hostnamectl/systemctl`(主机名和服务管理)。这些命令帮助用户启动接口、设置IP地址、查看连接和路由信息。不同发行版可能有差异,建议参考相应文档。
19 4
|
1天前
|
Ubuntu 网络协议 Linux
Linux(20) Ubuntu 20.04 网络接口自动切换路由配置
Linux(20) Ubuntu 20.04 网络接口自动切换路由配置
9 0
|
1天前
|
SQL 安全 算法
网络防线的构筑者:洞悉网络安全漏洞与加固信息防护
【4月更文挑战第22天】在数字化浪潮下,网络安全和信息安全成为维护社会稳定、保障个人隐私的重要基石。本文将深入探讨网络安全中存在的漏洞问题,介绍现代加密技术,并强调提升全民安全意识的必要性。通过对这些关键知识点的分享,旨在为读者提供一个关于如何构建和维护一个安全网络环境的全面视角。
|
1天前
|
监控 安全 网络安全
云端防御战线:云计算环境下的网络安全与信息保护策略
【4月更文挑战第22天】随着企业和个人用户对云服务的依赖日益加深,云计算环境的安全性成为信息技术领域关注的焦点。本文深入探讨了云计算平台面临的安全威胁、信息安全管理的挑战以及前沿防御技术。通过分析数据加密、身份验证、入侵检测等关键技术在云服务中的应用,提出了一个多层次、综合性的网络安全策略框架。此框架旨在为云服务提供商和使用者提供一套实用的安全保障措施,确保云资源的安全高效运营。
|
3天前
|
存储 安全 网络安全
构筑安全之盾:云计算环境下的网络安全与信息保护策略
【4月更文挑战第19天】随着云计算技术的飞速发展,企业和个人越来越依赖于云服务来存储、处理和交换数据。然而,这种便利性背后隐藏着潜在的安全风险。本文深入探讨了在云计算背景下,如何通过综合性的安全措施和策略来强化网络安全防护,确保数据的完整性、可用性和机密性。我们将分析当前面临的主要安全挑战,并基于最新的技术进展提出相应的解决方案,以期达到有效防御外部威胁和内部漏洞的目的。
15 4
|
4天前
|
监控 安全 算法
数字堡垒的构建者:网络安全与信息保护的现代策略
【4月更文挑战第19天】在信息化快速发展的今天,网络安全和信息安全已成为维护社会稳定、保障个人隐私和企业商业秘密的关键。本文将深入探讨网络安全漏洞的成因、加密技术的进展以及提升安全意识的重要性,旨在为读者提供一套综合性的网络防护策略,以应对日益猖獗的网络威胁。
7 1
|
6天前
|
监控 安全 网络安全
云端防御战线:云计算中的网络安全与信息保护策略
【4月更文挑战第17天】 随着企业逐渐将重心转向云服务,云计算已经成为现代信息技术架构中不可或缺的一部分。然而,这种转变也带来了新的挑战——如何确保在公共、私有或混合云环境中的数据安全和网络防护。本文探讨了云计算平台下的网络安全策略与实施措施,包括最新的加密技术、身份验证机制以及入侵检测系统。同时,分析了信息安全管理在维护数据完整性、保障用户隐私及符合法规要求方面的重要性。通过综合考量技术手段与管理策略,本文旨在为读者提供一份全面的云计算安全指南。
15 5
|
8天前
|
存储 安全 网络安全
云端防御:在云计算时代维护网络安全与信息完整性
【4月更文挑战第15天】 随着企业和个人用户日益依赖云服务,云计算环境的安全性已成为技术发展的一个关键挑战。本文探讨了云计算平台面临的安全威胁、信息安全的关键策略以及实施有效防护措施的必要性。我们将分析数据加密、身份验证和访问控制等核心技术,并讨论如何通过综合方法保护云资源以应对不断演变的网络攻击。
14 2
|
10天前
|
存储 SQL 安全
网络防线的构筑者:洞悉网络安全与信息保护之道
【4月更文挑战第13天】 随着信息技术的蓬勃发展,网络已成为日常生活和工作不可或缺的一部分。然而,伴随便利的同时,网络安全威胁也日益猖獗,从个人信息泄露到企业数据被盗,安全事件频发。本文将深入探讨网络安全领域的关键组成部分:网络漏洞、加密技术以及安全意识,旨在为读者提供全面的安全防护策略和技术应用知识,助力个人和组织在数字世界中筑起坚固的防线。
|
11天前
|
人工智能 安全 网络安全
云端守卫:云计算环境中的网络安全与信息保护策略
【4月更文挑战第12天】 随着企业与个人日益依赖云服务,数据存储、处理和流通的边界愈发模糊。本文探讨了在动态且复杂的云计算环境中,如何通过创新的安全技术和策略来维护网络安全和保障信息完整性。重点分析了包括身份认证、数据加密、访问控制及入侵检测等在内的关键安全措施,并提出了多层次防御模型,以增强云服务用户的信心,同时促进云计算生态系统的健康发展。

热门文章

最新文章