udhcp源码详解(三)上 之配置信息的读取
上节介绍了存储管理配置信息的结构体struct server_config_t,该结构体贯穿整个server端程序的运行。
在dhcpd.c里的用该结构体定义个一个全局的变量:
struct server_config_t server_config;
在server启动做的第一件事就是初始化这个全局变量server_config:

现在就进入read_config函数,一睹其真容!
学习这个函数,在以后遇到要读取配置信息可以参照read_config函数的写法。
read_config函数的定义是在file.c文件里。
分析read_config函数之前先来看一个结构体数组:
结构体的定义:

该结构体数组的定义以及初始化:

结构体名和数组名可以看出,config_keyword,配置信息关键字,正如其名,是辅助读取配置信息的。
数组里的每个config_keyword结构体元素中的keyword成员的值,与server_config_t里的成员变量名一一对应,该成员指示的就是配置的是server_config_t里的哪个成员。
读取配置信息的操作,配置信息读取存储到哪里,以及配置信息的默认值,这些由config_keywork里的后面的3个成员给出的。
成员heandler是一个函数指针,指向的函数即提供了怎么读取配置信息,以及把配置信息写到指定地址内。
arg, def则作为handler指向函数的两个各参数,arg告诉函数把配置信息存储到的地址,def则是配置信息的值,def是配置信息的默认值。
keyword数组里每个元素里的函数指针handler指向的这些函数,其定义都在file.c文件里。
handler函数的类型 : int (const *handler)(const char *line, void *arg)
1) read_ip: 把字符串格式的IP地址转换成uint32_t的IP格式,并存储到arg所指的内存。
2) read_u32: 把字符串格式的数转换成uint32_t类型数字,并存储到arg所指的内存。
3) read_yn: line字符串是“yes” 还是 “no”?若“yes”,将arg所指的内存赋1,反之,赋0
4) read_str:首先free(*arg)释放掉*arg指的内存,再根据字符串line的大小分配内存,并把line里的值复制到里面,让*arg指向新分配的内存。
5) read_opt: 从字符串line里读取options写到*arg所指的struct option_set链表里。(链表的每个结点data以CLV方式组织数据)。
read_opt对选项的信息的读取借助里也借助结构数组(在options.c里定义的),所以函数比较复杂,这里只用知道函数作用。
6) read_staticlease:从line字符串里读取MAC、IP地址字符串里MAC与IP用’/t’or’=’作为分隔)再把MAC和IP添加到*arg所指的static_lease链表里。static_lease链表是dhcp Server管理已租赁出去的IP和获得该IP的客户机的MAC绑定。
7) read_mac: 从字符串格式MAC地址里读出MAC并转化的MAC存储arg所指的内存里
上面的read_xxx函数,read成功返回1, 失败返回0。
上面讲解的这么的多都是read_config函数的基础,好啦,现在正式进入read_config函数:

若read_config函数到这就结束了,server依靠这些默认配置的值也可以工作(options字段没有默认值,不能给client其他的网络配置,但可以给client端分配IP的),但这样的话,程序就缺乏灵活性,IP地址池不能修改,租赁时间无法设定等。


上面这段就是从文件里读取配置信息,下面是摘自udhcp.conf文件的部分配置信息:

while(fgets(buffer, READ_CONFIG_BUF_SIZE, in))
每次从文件里读取一行,存放在buffer里,在对buffer处理,空行、注释行(还有只有token, 没有line的)直接跳过继续读取下一行。
token = strtok(buffer, “ /t”); 取到该行的keyword (文件里key与value之间使用空格或’/t’)
line = strtok(NULL, “”); 取到该行的配置信息值
这样(还需简单处理下)就可以根据keywords数组把从文件读取到的配置信息写到server_config相应的成员里。
差不多了,总结下read_config函数,她对配置的对象全局变量server_conifg,通过一个辅助结构数组来对server_config里的成员变量进行赋值的。真正对于成员的赋值操作都是通过数组里元素的函数指针handler指向的函数进行的。
read_config只是做了从文件的每行读出信息,并作些处理,得到token和line,利用token在数组里找到对应的handler和arg,………
udhcp源码详解(三)上 之配置信息的读取的更多相关文章
- udhcp源码详解(五) 之DHCP包--options字段
中间有很长一段时间没有更新udhcp源码详解的博客,主要是源码里的函数太多,不知道要不要一个一个讲下去,要知道讲DHCP的实现理论的话一篇博文也就可以大致的讲完,但实现的源码却要关心很多的问题,比如说 ...
- udhcp源码详解(三) 下 之配置信息的读取
上节讲解了read_config函数,读取配置信息到server_config的相应成员变量里,但read_config函数只负责把配置信息重文件里读出来,具体怎么把信息填写到指定的地址内,是调用ke ...
- udhcp源码详解(四) 之租赁IP的管理
Server端对于租赁出去的IP的管理是基于结构体dhcpOfferedAddr的,该结构体的定义是在leases.c文件里:(结构体的成员介绍说明见详解之数据结构) 1: struct dhcpOf ...
- OkHttp3源码详解(三) 拦截器-RetryAndFollowUpInterceptor
最大恢复追逐次数: ; 处理的业务: 实例化StreamAllocation,初始化一个Socket连接对象,获取到输入/输出流()基于Okio 开启循环,执行下一个调用链(拦截器),等待返回结果(R ...
- OkHttp3源码详解(三) 拦截器
1.构造Demo 首先构造一个简单的异步网络访问Demo: OkHttpClient client = new OkHttpClient(); Request request = new Reques ...
- udhcp源码详解(一)之文件组织结构(dhcp server) --转
udhcp目录下有十几个源文件,一个源文件相对应一个模块,完成一系列相关的功能,例如在static_leases.c主要针对static_lease链表增删查找等操作. dhcpd.c—— 整个d ...
- udhcp源码详解(二)--转
定义的数据结构对于C程序的重要性,不言而喻.面向对象设计的程序是一个个对象的集合,而面向过程语言设计的程序则是数据结构与算法的集合. 下面来分析的是dhcp server中的定义结构体: 1).在pa ...
- spring事务详解(三)源码详解
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
- 条件随机场之CRF++源码详解-预测
这篇文章主要讲解CRF++实现预测的过程,预测的算法以及代码实现相对来说比较简单,所以这篇文章理解起来也会比上一篇条件随机场训练的内容要容易. 预测 上一篇条件随机场训练的源码详解中,有一个地方并没有 ...
随机推荐
- [LUOGU] P3871 [TJOI2010]中位数
题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...
- LeetCode(101)Symmetric Tree
题目 Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). Fo ...
- 【CodeForces 426】div1 B The Bakery
Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...
- #region 私有字段
#region 私有字段 private string _读者类别; private string _读者类别名称; priva ...
- Couchbase IV(管理与维护)
Couchbase IV(管理与维护) 管理 常用命令 Command Description server-list List all servers in a cluster server-inf ...
- zoj 2722 Head-to-Head Match(两两比赛)
Head-to-Head Match Time Limit: 2 Seconds Memory Limit: 65536 KB Our school is planning to hold ...
- Charm Bracelet(01背包)
Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fil ...
- css中background-image背景图片路径设置
web项目中经常会用到background-image:url(),很多小伙伴不知道该怎么写需要的图片路径. 在此之前先要知道几个重要的东东: / 项目根目录 这个不用多说,就是程序 ...
- CentOS7中,vnc分辨率设置。
使用geometry参数进行调整 例如,我们需要将分辨率调整到800x600 [root@secdb ~]# vncserver -geometry 800x600 New 'secdb:5 (roo ...
- [POJ1797] Heavy Transportation(最大生成树 || 最短路变形)
传送门 1.最大生成树 可以求出最大生成树,其中权值最小的边即为答案. 2.最短路 只需改变spfa里面的松弛操作就可以求出答案. ——代码 #include <queue> #inclu ...