udhcp源码详解(二)之定义的结构体

netsh配置staticip与dhcp 采用windows的netsh工具编写配置静态ip和dhcp的脚本 立即下载

udhcp源码详解(二)             之定义的结构体

Author : hui <632254504@qq.com>

From : <http://blog.youkuaiyun.com/hui_love2046>

Created : 2010-10-2     ---   2010-10-3

 

定义的数据结构对于C程序的重要性,不言而喻。面向对象设计的程序是一个个对象的集合,而面向过程语言设计的程序则是数据结构与算法的集合。

下面来分析的是dhcp server中的定义结构体:

 

1)、在packet.h文件里定义了DHCP报文的格式:

 

struct dhcpMessage报文的字段虽然都有注释,但还是有必要讲下options字段。

options在大多文档中的说法是可选字段,大小不定,对于这个字段的重要性没有太多的强调。其实在DHCP交互过程,客户得到IP的配置过程,这个options字段有着很重要的作用,传递个很多不可或缺的信息。

例如Server与Client交互时,数据包的类型,是通过该字段的指示的。还有Client要成功连接到互联网,不只是需要IP,还需要其他的配置信息,如Dns、Router、Subnet等信息,Server就是通过options字段把这些信息传递给Client。(查看options支持哪些选项信息可以查看文档RFC2132)

 

问题来啦!!

这么多信息都放到一个字段,怎么合理的组织在一起呢,怎么能让交互双方准确的从这个字段取到相应的信息呢?

 

options字段才用“CLV“方式组织数据信息,OPT_CODE:标识号,唯一标识后面的信息内容;占1byte;OPT_LEN:长度,表示后面信息内容的长度,占1byte;value(OPT_DATA):信息内容,其长度由OPT_LEN所指定,以byte为单位(RFC2132文档给出所有支持选项的OPT_CODE,和可以确定长度的OPT_LEN的值)

 

CLV 的数据组织方式:

       0                     1                2                                        +Length

Code

Length

DATA

      

       这是一种很漂亮的把多种数据信息组织在一个字段的方式,后面会看到对options字段相应的操作函数,这些函数就是根据CLV的方式对数据进行提取或者组织的。

      

另外options字段存储的信息分为三大类:

              ①    DHCP_PADDING  填充字节       //读取的信息时候注意跳过

②    DHCP_END          结束标志       //标志options字段的结束

③    CLV组织的有价值信息              //real value for us

 

options字段还有个让人纠结的情况——选项过载,其实也没什么,在后面遇再说吧!

 

2)、在dhcpd.h里定义里一个贯穿整个Server端程序的结构体struct server_config_t

 

 

上面的注释是源文件上的,本来的打算翻译下的,看了下注释很直白,没什么好翻译的,只是讲下其中的专业术语(好像是这么说的)。

network order 网络字节序,  host order       主机字节序    相信大家了解她们的区别吧。

(定义类型是 uint32_t … ,说明变量是以network order存储的

常用数据类型 int long … ,说明变量是以host order存储的)

下面讲解下其中一些重要的成员:

①    start,end可分配地址空间,每个客户的请求获得的IP都在这个内。IP地址池。

②       struct option_set结构体的定义也在dhcpd.h里

 

Option set翻译过来:选项集合,就是的该结构的意义。上面分析struct dhcpMessage报文里有个选项字段options,她的值就是根据该集合(Option List)填写赋值的。

集合(Option List)里每个结点是一个选项信息,数据CLV的组织方式的。

       与报文中options字段的区别是,报文里用一个options字段存储了所有的选项信息,options_set而是把一个一个的选项信息用链表链接起来。

③       下面的几个是与租赁期限有关的成员变量

unsigned long lease                      client请求的租赁期限最大值,>lease,就以lease为租赁期限;client请求未指明租赁期限,lease作为其租赁期限(静态租赁的默认租期)。

 

unsigned long decline_time    server的DHCPOFFER报文提供一个IP给client,client检测IP已经被其他主机使用,发送DHCPDECLINE报文给server,server接到该报文后,把IP添加到动态租赁数组里,租赁租期就是decline_time,对应的MAC为blank_chaddr(黑户,很形象^-^,实际值是全0)

 

unsigned long confict_time    server在IP地址池找个a free IP时,检测到IP已被网络中的主机所使用,会把IP添加到动态租赁数组里,租赁期限就是confict_time,MAC:blank_chaddr。

 

unsigned long offer_time       server发送DHCPOFFER报文时,即向client提供了IP地址,server会把IP和对应得MAC添加的动态租赁表里,但这个IP不一定会被client使用,所以添加到动态租赁表里的租赁期限要短,offer_time就是这个租赁期限(default : 60s)。(当server接收到DHCPREQUEST的时候会把租赁期限修改成请求的租赁期限)。

 

unsigned long min_lease        client端的请求租赁期限不能小于min_lease。

 

 

④       与保存租赁信息有关的两个成员变量:

char remaining              摘自dhcpd.conf里的注释(以及翻译和注解):

# If remaining is true (default), udhcpd will store the time

# remaining for each lease in the udhcpd leases file. This is

# for embedded systems that cannot keep time between reboots.

# If you set remaining to no, the absolute time that the lease

# expires at will be stored in the dhcpd.leases file.

# 如果剩下的就是true(默认),udhcpd将存储时间文件中

# 的每个udhcpd租赁租赁剩余。

# 这对于嵌入式系统,不能保持在重新启动的时间。

# (即重新启动就不算入租赁时间里)

# 如果您设置其余为NO,绝对时间,

# 租赁期满时将被储存在dhcpd.leases文件档案。

# 绝对时间,例:          starts 0 2000/01/30 08:02:54;

#                                 ends 5 2000/02/04 08:02:54;

# 而嵌入式存储的是租赁剩余时间

# 即       leases[i].expires - time(0)      的值

unsigne long auto_time   how long should udhcpd wait before writing a config file.

                                   if this is zero, it will only write one on SIGUSR1

                                   多长时间把动态租赁表里的信息写入文件(dhcpd.leases)里。

                                   Auto_time = 0的,只有等到SIGUSR1信号的时候才写。

 

⑤       struct static_lease *static_lease

/* dhcpd.h */

struct static_lease{

       uint8_t                  *mac;

       uint32_t                 *ip;

       struct static_lease   *next;

};

因为DHCP允许手动为client端配置IP,server端管理这些手动配置的IP就是使用该结构。

      

在dhcpd.c文件里声明定义一个struct server_config_t的全局变量server_config,server对于client的响应交互都必须有这个变量的参与。

 

3)、server端对于租赁出去的IP的管理基于以下这个结构体:

    

              uint8_t    chaddr[16];    客户机的 MAC地址;

              uint32_t   yiaddr;           客户机租赁的IP地址;

 

 

              uint32_t   expires;          客户机租赁IP的到期时间

(是未来的一个时间点,是从1970.1.1午夜开始到租赁到期时刻的秒数)

这里有些奇怪,使用uint32_t声明的expires存储方式用的是host order, 这是因为server在把租赁记录保存到dhcpd.leases文件时使用的是network order方式保存的。(个人认为声明为unsigned long类型更为合适)

 

在dhcpd.c文件里声明定义一个 指向struct dhcpOferedAddr类型数组的全局指针变量leases。leases指向的数组大小由IP地址池大小决定的。

 

       Server端主要的结构体就是这些,他们是整个server端程序跑起来的基础。还有一些其他结构体的设计是为了某些函数特别定制的,在分析具体函数再做讲解。

从零到一:用CubeMX和485模块快速上手多摩川绝对式编码器(附清零操作详解) 本文详细介绍了如何使用STM32CubeMX和485模块快速上手多摩川绝对式编码器,包括硬件连接、STM32配置、协议解析及清零操作。通过具体的代码示例和调试技巧,帮助开发者高效实现编码器数据读取和清零功能,特别适合STM32单片机开发者参考。 阅读详情

相关推荐

桌面云架构讲解(VDI、IDV、VOI/TCI、RDS)

什么是云桌面桌面云是虚拟化技术成熟后发展起来的一种应用,桌面云通常也称为云桌面、VDI等桌面云中的云一般指的是企业的数据中心,通过在数据中心的服务器上安装若干个虚拟机,这个虚拟机就是桌面;但是终端无法直接连接到这个虚拟机(云桌面),因此就需要通过技术将就虚拟机变为桌面云发放出来;发放出来之后只需要瘦客户端(PC、手机、瘦客户机等)连接到数据中心的云桌面服务器平台,最终就可以连接到桌面来进行使用云桌面的优势终端与数据信息分离,数据在后台集中处理和存储 ,数据实现统一管理。

m0_49864110的博客 3万+

嵌入式Linux热点分享网络(三)

udhcpd为局域网提供自动获取IP地址和DNS功能 创建好AP以后,STA终端可以连接到AP。此时STA想要连接到局域网就需要有IP地址,如果想连接到外网就需要网关。如果想连接到域名表示的外网,就需要dns服务器。 udhcpd是dhcp服务器,动态的提供IP地址,网关和DNS。所以一般AP端通过hostapod建立了无线的物理连接之后还需要提供DHCP服务功能,这样其他STA就可以获取IP地址等配置,只有获取到IP地址,才是真正意义上组成了局域网。 udhcpd(/etc/udhc...

专注嵌入式领域 1002

使用Label Studio标注车牌数据:YOLOv26模型训练指南

在计算机视觉领域,数据标注是模型训练的基础环节,直接影响最终模型的识别精度。Label Studio作为专业的标注工具,支持多种标注类型和格式导出,特别适合目标检测任务的数据准备。通过多边形标注技术,可以精确捕捉车牌的四个角点,生成旋转矩形框(OBB)标注数据,这种标注方式相比传统水平框能更好地处理倾斜车牌场景。标注完成后,数据可导出为YOLO格式,直接用于YOLOv26等先进目标检测模型的训练。在实际工程中,合理的标注策略和严格的质量控制能显著提升车牌识别模型在复杂场景下的鲁棒性,适用于智能交通、停车场管

chuozhi7142的博客 904

UNIX source code-DHCP

unix dhcp部分源码解读

m0_47104421的博客 1987

从入门到实战:rkhunter(Rootkit猎手)在Linux服务器安全运维中的部署与自动化监控

本文详细介绍了rkhunter(Rootkit猎手)在Linux服务器安全运维中的部署与自动化监控方法。从Rootkit的危害性入手,讲解了rkhunter的安装、配置及实战应用,包括如何建立基准、优化定时任务方案以及智能告警处理。通过多级过滤脚本和系统级联动,帮助运维人员高效识别和应对Rootkit威胁,提升服务器安全性。

weixin_28715953的博客 240

骚操作,尝试使用Xilinx XVC协议,通过Jlink来下载调试Xilink zynq FPGA芯片

最近一直在玩zynq芯片,手头使用的Xilinx Platform USB Cable 下载线真是辣鸡,速度慢如蜗牛,每次下载bit文件或者烧写flash文件都要大半天,实在是难以忍受。逻辑分析仪看了下xilinx的下载线,速度只有6.25M,并且数据间隔非常大,不懂这线的开发者咋想的,这总线利用率真是低到爆了 上图为xilinx DLC 10下载线波形,惨不忍睹! 为了不浪费生命在下载等待时间上,我打算找找看有没有别的仿真调试选择。经过一番查找后发现Xilinx的仿真器好像选择不是很多,要么贵死要

听我瞎扯淡的博客 1万+

linux 路由转发及udhcpd的配置上网

海思V711平台4G模组上路由转发配置: 1、配置udhcpd.conf文件 vim /etc/udhcpd.conf start 192.168.9.1#定义地址池的开始地址 end 192.168.9.254 #定义地址池的结束地址 interface gmac0 #dhcp服务器中响应dhcp协议的接口 opt dns 8.8.8.8 219.239.26.42#定义dns服务器地址 option subnet 255.255.255.0 opt router 192...

alimingh的博客 3862

YOLOv11改进 | 特殊场景检测篇 | 低照度图像增强网络SCINet改进黑暗目标检测(全网独家首发)

本文给大家带来的改进机制是低照度图像增强网络SCINet,SCINet(自校正照明网络)是一种专为低光照图像增强设计的框架。它通过级联照明学习过程和权重共享机制来处理图像,优化了照明部分以提升图像质量。我将该网络集成在YOLOv11的主干上针对于图像的输入进行增强,同时该网络的并不会增加参数和计算量,基本和普通的网络结构保持一致,同时该结构支持自定义调节层数,来控制图像增强的效果 ,非常适合想要在黑夜目标检测领域发表文章的读者,该基本网络不会影响模型的速度。欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 2207

udhcp源码详解(五) 之DHCP包--options字段

中间有很长一段时间没有更新udhcp源码详解的博客,主要是源码里的函数太多,不知道要不要一个一个讲下去,要知道讲DHCP的实现理论的话一篇博文也就可以大致的讲完,但实现的源码却要关心很多的问题,比如说,理论上说从IP地址池取到一个空闲的IP,就这么一句,在源码的体现也是一大段。算啦,讲多少算多少吧,进入主题! struct dhcpMessage报文里uint8_t op...

weixin_33778544的博客 328

图像标注神器:完全开源免费的多功能标注工具Labelme详解

Labelme是MIT开发的免费开源图像标注工具,支持多边形、矩形等多种标注类型,适用于目标检测、分割等计算机视觉任务。提供Windows可执行文件和Python安装两种方式,可输出JSON格式并转换为COCO等标准数据集。具有跨平台、功能全面、社区活跃等优势,能显著提升标注效率,是AI视觉项目的重要数据准备工具。

数字人生 528

大数据分析案例-基于决策树算法构建世界杯比赛预测模型

本项目旨在分析往届世界杯比赛数据,找出规律,最后使用决策树算法构建世界杯比赛预测模型,给出两个球队即可预测胜率,可以给爱看球的小伙伴提供一个参考。本次实验我们使用了2018年及其之前的世界杯比赛数据,通过建立决策树模型,模型准确率为82%,接着我们使用该模型预测了2022年世界杯的5场半决赛及决赛,模型准确率也是接近80%的,说明模型效果还是很不错的。心得与体会:通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。

m0_64336780的博客 1万+

udhcp源码详解(三)上   之配置信息的读取

udhcp源码详解(三)上之配置信息的读取 Author : hui<632254504@qq.com> From :<http://blog.youkuaiyun.com/hui_love2046> Created : 2010-10-3 上节介绍了存储管理配置信息的结构体struct server_config_t,该结构体...

echo 675

2024年电气工程师最新面试题及答案

1. **基本电气工程原理**:包括电流、电压、电阻、功率等基本概念。2. **欧姆定律**:V = IR,描述电压、电流和电阻之间的关系。42. **风力发电系统组成**:包括风力涡轮机、发电机、控制系统等。44. **智能电网技术**:包括自动化控制、通信技术、数据分析等。10. **减少EMI**:使用屏蔽、滤波、合理布线等方法。40. **光伏系统组成**:包括光伏板、逆变器、控制器等。48. **能量存储技术**:包括电池、超级电容器、飞轮等。

guo162308的博客 6563

udhcp源码详解

udhcp源码详解(五) udhcp源码详解(四) udhcp源码详解(三) 下 udhcp源码详解(三) 上 udhcp源码详解(二) udhcp源码详解(一) udhcp详解源码(序)

奔跑的路 2422

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

udhcp源码详解(三)下   之配置信息的读取

udhcp源码详解(三)下之配置信息的读取 Author : hui<632254504@qq.com> From :<http://blog.youkuaiyun.com/hui_love2046> Created : 2010-10-3 上节讲解了read_config函数,读取配置信息到server_config的相应成员变量里,...

echo 656

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

udhcp源码详解(一)之DHCP服务器和客户端的工作流程

这篇udhcp详解是基于busybox-1.20里的…/busybox-1.20/networking/udhcp/目录下的源码进行讲解与分析,主要是对udhcp server端源码进行的讲解,client端相对于server端相对简单一些,源代码上面表现的实现思想大体相似。 udhcp目录下有十几个源文件,一个源文件相对应一个模块,完成一系列相关的功能,例如在static_...

echo 4130

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

udhcp源码详解(三) 上

<br />udhcp源码详解(三)上             之配置信息的读取<br />Author : hui <632254504@qq.com><br />From : <http://blog.youkuaiyun.com/hui_love2046><br />Created : 2010-10-3<br /> <br />       上节介绍了存储管理配置信息的结构体struct server_config_t,该结构体贯穿整个server端程序的运行。<br />在dhcpd.c里的用该结构体定义个一

前进路上的点滴 5096

udhcp源码详解 续

楼主仔细阅读udhcp源码觉得略有所得。 udhcp源码已由hui_love2046介绍了一部分,楼主狗尾续貂地介绍剩余部分的细枝末节。 可能楼主下载到的源码是别人二次编辑过的,但大体上是没多大差别的。 查看之前udhcp1-5详解,请参见以下链接: http://blog.youkuaiyun.com/hui_love2046/article/details/5919680

baidu20008的专栏 1389

udhcp源码详解(五)

<br />udhcp源码详解(四)             之DHCP包--options字段<br />Author : hui <632254504@qq.com><br />From : <http://blog.youkuaiyun.com/hui_love2046><br />Created : 2010-10-25<br /> <br />           中间有很长一段时间没有更新udhcp源码详解的博客,主要是源码里的函数太多,不知道要不要一个一个讲下去,要知道讲DHCP的实现理论的话一篇博文也就

前进路上的点滴 5182

一文彻底了解UDHCP源码核心☝️

本文结合了UDHCP的源码,整理了UDHCPD和UDCPC的工作流程图

m0_51451952的博客 1107

udhcp源码详解(二)

<br />udhcp源码详解(二)             之定义的结构体<br />Author : hui <632254504@qq.com><br />From : <http://blog.youkuaiyun.com/hui_love2046><br />Created : 2010-10-2     ---   2010-10-3<br /> <br />定义的数据结构对于C程序的重要性,不言而喻。面向对象设计的程序是一个个对象的集合,而面向过程语言设计的程序则是数据结构与算法的集合。<br />下面来

前进路上的点滴 8082

udhcp源码详解(三) 下

<br />udhcp源码详解(三)      下   之配置信息的读取<br />Author : hui <632254504@qq.com><br />From : <http://blog.youkuaiyun.com/hui_love2046><br />Created : 2010-10-3<br /> <br />       上节讲解了read_config函数,读取配置信息到server_config的相应成员变量里,但read_config函数只负责把配置信息重文件里读出来,具体怎么把信息填写到指定

前进路上的点滴 4527

udhcp源码详解(五) 之DHCP包--options字段

udhcp源码详解(五)之DHCP包--options字段 Author : hui<632254504@qq.com> From :<http://blog.youkuaiyun.com/hui_love2046> Created : 2010-10-25 中间有很长一段时间没有更新udhcp源码详解的博客,主要是源码里...

echo 1766

udhcp详解源码(序)

udhcp源码详解(序) Author : hui From : Created : 2010-10-1   这篇udhcp详解是基于busybox-1.20里的 …/busybox-1.20/networking/udhcp/目录下的源码进行讲解与分析,主要是对udhcp server端源码进行的讲解,client端相对于server端相对简单一些,源代码上面表现的实现思

前进路上的点滴 5283

udhcp源码详解(一)

<br />udhcp源码详解(一)             之文件组织结构(dhcp server)<br />Author : hui <632254504@qq.com><br />From : <http://blog.youkuaiyun.com/hui_love2046><br />Created : 2010-10-2<br /> <br />       udhcp目录下有十几个源文件,一个源文件相对应一个模块,完成一系列相关的功能,例如在static_leases.c主要针对static_lease链

前进路上的点滴 8162

udhcp源码详解(四)

udhcp源码详解(四)             之租赁IP的管理Author : hui From : Created : 2010-10-4       Server端对于租赁出去的IP的管理是基于结构体dhcpOfferedAddr的,该结构体的定义是在leases.c文件里:(结构体的成员介绍说明见详解之数据结构)struct dhcpOfferedAddr { uint8_t chaddr[16]; uint32_t yiaddr; /* network order */ uint32

前进路上的点滴 5811
上一篇: udhcp源码详解(一)之DHCP服务器和客户端的工作流程
下一篇: udhcp源码详解(三)上   之配置信息的读取
JIANXIN.Y
博客等级 码龄9年 273粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值