前置
在 dibbler-DHCPv6 的开源框架(C++ 实现)1 说了 dibbler 的安装和编译、使用。在这里说一下 server 的源码分析。
一、主函数文件
dibbler/Port-linux/dibbler-server.cpp
代码路径:
二、dibbler 中类的介绍
先看命名,如下图,Clnt
- client
的缩写;Rel
- Relay
的缩写; Srv
-Server
的缩写,所以client
、relay
、server
的功能相关的文件区分很清晰。如果看 dibbler-server 的代码,那么 Clnt
和Rel
开头的文件不用看。
然后看不同平台的代码,它支持 BSD
、Linux
、SUN
、WIN32
平台,对于不同的平台,它有单独的文件夹将平台不同的代码区分开来,这样使得代码很整洁。不像 wide-dhcpv6,对于不同平台的代码用 宏来包裹起来,挺晦涩的。如图:
- CfgMgr :dibbler-server、dibbler-client、dibbler-relay 三个程序共通的配置项,是一个 top class。有 DUID、LogLevel、DNS 等共同拥有的信息。
- Options: 是在接收到 DHCPv6 报文后,解析 DHCPv6 报文中的 option 项的。
二、主要函数解释
I. TDHCPServer 构造函数
// main.cpp
TDHCPServer srv(SRVCONF_FILE);
会调用它的构造函数,在构造函数内部会完成一系列的 init
操作
TDHCPServer::TDHCPServer(const std::string& config)
{
......
}
1. 加载配置文件和设置 DUID
// 读取加载配置文件 server.conf,并设置 DUID
TSrvCfgMgr::instanceCreate(config, SRVCFGMGR_FILE);
2. 地址管理器
// 地址管理,主要是客户端的 link-local 地址、分配的地址等
TSrvAddrMgr::instanceCreate(SRVADDRMGR_FILE, true /*always load DB*/ );
if ( SrvAddrMgr().isDone() ) {
Log(Crit) &