自己动手写路由器之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这个函数还有很多其它的功能,有兴趣的朋友可以问度娘,这里就不加详述了!

目录
相关文章
|
3天前
|
SQL 安全 算法
网络防线的构筑者:深入网络安全与信息保护
【5月更文挑战第8天】在数字时代,数据成为了新的金矿,而网络安全则是守护这些宝贵资源的堡垒。本文将探讨网络安全漏洞的形成、加密技术的应用以及提升个人和企业的安全意识的重要性。通过对网络威胁的剖析和防护策略的介绍,旨在为读者提供一系列实用的网络安全知识与实践指导。
7 1
|
4天前
|
存储 算法 网络协议
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
12 0
|
4天前
|
安全 算法 网络安全
网络防线的构筑者:洞悉网络安全与信息保护
【5月更文挑战第7天】在数字化时代,数据成为了新的石油。随之而来的是对数据安全和隐私保护的挑战。本文深入探讨了网络安全漏洞的概念、成因以及它们对个体和企业造成的潜在危害。同时,文章将解析加密技术的种类和原理,以及它们如何成为维护信息安全不可或缺的工具。此外,强调了提升安全意识的重要性,并提出了实用的策略和建议,以增强个人和组织在面对日益复杂的网络威胁时的防御能力。
39 4
|
4天前
|
云安全 安全 网络安全
构筑安全之云:云计算环境下的网络安全与信息保护
【5月更文挑战第7天】 随着信息技术的飞速发展,云计算已成为支撑现代企业运作的重要基石。然而,伴随其便利性与高效性的,是对网络安全和信息保护的新挑战。本文旨在深入探讨云计算环境中所面临的核心安全威胁,并分析现有及新兴的安全技术如何协同作用以强化数据保护。通过综合评估不同防护策略的优势与局限,文章提出了一个多层次、动态适应的安全框架,以期为构建更为坚固的云上防线提供参考和启示。
|
5天前
|
网络协议 Linux 开发工具
Linux中 /etc/sysconfig/network-scripts/ifcfg-<interface> 网络接口配置 详解 看这一篇够用
Linux中 /etc/sysconfig/network-scripts/ifcfg-<interface> 网络接口配置 详解 看这一篇够用
|
5天前
|
分布式计算 资源调度 安全
Hadoop节点检查网络交换机、路由器和网线
【5月更文挑战第1天】您可以对Hadoop节点中的网络交换机、路由器和网线进行全面的检查,确保这些设备正常运行并且网络连接稳定可靠。如果在检查过程中发现任何问题,应及时解决,以避免影响Hadoop集群的稳定性和性能。
25 6
|
5天前
|
SQL 安全 网络安全
网络堡垒的构建者:深入网络安全与信息保护
【5月更文挑战第6天】 在数字化浪潮不断推进的今天,网络安全和信息安全成为了维护个人隐私、企业商业秘密和国家安全的重要议题。本文将探讨网络安全中的漏洞问题、加密技术的进展以及提升安全意识的必要性。通过分析当前网络攻击手段的复杂性,我们揭示了安全漏洞产生的原因及其对系统安全的潜在威胁。同时,文章还将介绍最新的加密技术如何为数据传输提供强有力的保护,并讨论如何通过培训和教育来增强用户的安全意识,以形成更为坚固的网络防线。
|
7天前
|
存储 安全 物联网
网络防御前线:洞悉网络安全漏洞与加固信息防线
【5月更文挑战第4天】 在数字化时代,网络安全已成为维护信息完整性、确保数据传输安全的关键阵地。本文将深入探讨网络安全领域的重要议题—包括识别和应对安全漏洞、应用加密技术以及提升个体和企业的安全意识。通过对这些关键要素的剖析,我们旨在为读者提供一个关于如何构建坚固网络防御体系的全面视角。
28 6
|
10天前
|
Ubuntu 网络协议 Linux
|
11天前
|
安全 算法 网络安全
数字堡垒的构筑者:网络安全与信息加密技术纵览
【4月更文挑战第30天】在数字化时代,数据如同虚拟世界中的流通货币,而网络安全则是保护这些数据的堡垒。本文深入探讨了网络安全漏洞的概念、危害及其产生的原因;同时详细介绍了加密技术的基本原理、类型以及它们在信息安全中的应用。此外,文章还强调了提升个人和企业的安全意识在构建安全防线中的重要性。通过分析当前网络威胁和防御策略的最新动态,旨在为读者提供全面的网络安全知识框架,帮助大家构建更加坚固的数字堡垒。