udhcp详解(八)——udhcpd.c的执行主线
来源:互联网 发布:淘宝号怎样会被冻结 编辑:程序博客网 时间:2024/06/05 15:39
udhcpd中调用各个模块完成dhcp服务器功能。
udhcpd执行首先是读入了DHCPD_CONF_FILE的配置文件,完成全局变量server_config的初始化工作。
之后将进程的pid加锁独占性地写入到文件中。再之后通过接口名,完成服务器接口索引MAC地址和IP地址的读取工作。
在调用daemon之后,再次写入dhcpd的pid。调用daemon之后将服务器进程设置为了守护进程在后台执行,但是其pid发生了变化,故此要再次写入。在文件中保存pid,是为了方便地查看到dhcp服务器守护进程的pid。
再之后创建了一个全双工管道,signal_pipe,并且设置了信号SIGUSR1和SIGTERM的捕捉函数signa_handler。之后进程阻塞select。等待管道数据的到来或是报文的到来。
这里服务器设计的函数比较巧妙的,试想一下,若客户端长时间不发送请求过来,而服务器这边我们想将内存中的租赁信息写入到文件中,那么该怎么办?服务器进程阻塞在select导致后续的操作不能够进行。
服务器这边使用的方法是,向进程发送信号,在信号捕捉函数里面向singalpipie管道无阻塞地写入信号,这样,服务器就不会阻塞于select了。同时后续代码也对接收到的数据进行了处理。
if (FD_ISSET(signal_pipe[0], &rfds)) {/*信号到达那么则进行处理*/if (read(signal_pipe[0], &sig, sizeof(sig)) < 0)continue; /* probably just EINTR */switch (sig) {case SIGUSR1:/*收到SIGUSR1立即写租约*/LOG(LOG_INFO, "Received a SIGUSR1");write_leases();/* why not just reset the timeout, eh */timeout_end = time(0) + server_config.auto_time;continue;case SIGTERM:/*收到SIGTERM服务器立即退出*/LOG(LOG_INFO, "Received a SIGTERM");exit_server(0);}}
至于服务器后续的一些操作就是正常的状态机的转移操作了,并不难理解。
而客户端那边与服务器大致类似。
最后,说一下,本udhcp的实现版本,和rfc所描述的dhcp差距还是挺大的,它只是简简单单的实现了dhcp功能。很多功能,没有实现,这其中大致有如下几点:
1)只提供了IP地址的动态分配,不支持自动分配和手动分配;
2)服务器在为客户端找到可用IP后,并不使用PING探测该IP的可用性,而是直接使用ARP进行探测,这样当客户端获得服务器分配的IP地址后,就直接使用了,并不再次广播ARP报文;
3)当目前该版本并没有实现对于选项过载的支持,但可以通过扩展实现对其的支持;
不提供DHCP安全功能,DHCP Snooping功能等;
4)客户机永远不会主动释放IP;
5)客户机重启后,直接再次发送DHCPOFFER而不是DHCPREQUEST。
若要实现其他一些它原本就不存在的功能,就的自己进行扩展。在弄懂代码和熟知RFC2131和2132的情况下,扩展其实还是不难的。
更过信息请参见;
dhcp协议有限状态机
RFC2131:
http://www.ietf.org/rfc/rfc2131.txt
本人享有博客文章的版权,转载请标明出处http://blog.csdn.net/baidu20008
- udhcp详解(八)——udhcpd.c的执行主线
- udhcp详解(七)——udhcp报文
- udhcp详解源码(序)
- udhcp源码详解(一)
- udhcp源码详解(二)
- udhcp源码详解(四)
- udhcp源码详解(五)
- udhcp详解源码(序)
- udhcp源码详解(一)
- udhcp源码详解(二)
- udhcp源码详解(四)
- udhcp源码详解(五)
- udhcp源码剖析(一)——DHCP服务器和客户端的工作流程
- udhcp源码剖析(二)——DHCP服务器重要的数据结构
- udhcp源码剖析(三)——DHCP服务器的初始化和配置
- udhcp源码剖析(四)——DHCP服务器的superloop
- udhcp源码剖析(五)——DHCP客户端重要的数据结构和初始化配置
- udhcp源码剖析(六)——DHCP客户端的superloop
- 成为高效程序员的7个重要习惯
- VLAN聚合(VLAN Aggregation)
- 1039. Course List for Student (25)-PAT
- 第一次使用GitHub
- C++中关于const, reference(&)一点小结
- udhcp详解(八)——udhcpd.c的执行主线
- linux2.6.32移植到fl2440 求助Cannot open /dev/ts0 (No such device) 问题
- android开发中实现对某一类型文件的sdcard扫描
- Android核心基础(一)
- 8个最佳的JavaScript移动应用开发框架
- 如何快速封装简练的C++类
- Hibernate缓存机制
- Android 数据存储和IO——SharedPreferences(一)
- 黑马程序员_面向对象