由于最近要自己实现一个嵌入式web服务器,所以开始了对嵌入式web服务器的相关学习。为了使自己对服务器了解更加深入,便找到了开源的服务器进行了相关学习。‘
首先学习的是 thttpd
thttpd 是一个小型的 HTTP 服务器
官方网址:http://www.acme.com/software/thttpd/
下载 version 2.25b 的源码后解压,切换到源码目录,编译步骤为:
./configure
make
thttpd一共有16个源文件:
config.h fdwatch.h libhttpd.h match.h mmc.h tdate_parse.h timers.h version.h
fdwatch.c libhttpd.c match.c mmc.c strerror.c tdate_parse.c thttpd.c timers.c
fdwatch是套接字管理模块
mmc是内存管理模块
timers是定时器管理模块
libhttpd实现http 服务端的处理方法
thttpd实现了主函数
下面是主模块的大体流程图:main
{
打开系统日志
处理main参数
读取流控配置文件
设置uid
获取当前工作目录
切换到后台模式
创建子进程,父进程结束
获取系统资源信息
注册处理系统信号的函数
初始化定时器资源
初始化HTTP SERVER 对象
创建系统定时器
创建连接表数组
将监听套接字加入select集合
主循环
{
获取套接字集合发生的事件
检查套接字上的发生的具体行为
接收新的连接
处理新的连接
}
销毁http server对象
关闭系统日志
退出
}
mmc模块分析
映射文件到内存,如果定义了HAVE_MMAP,使用mmap,否则使用malloc。 mmc_map函数的步骤是: 查找哈希表,如果已经存在于哈希表中,直接从表中取出,然后返回; 否则查找free_maps,如果free_maps可用,直接取出来用,free_maps为空时,malloc一块内存使用; 接下来判断文件大小,大小不为0时,因为定义了HAVE_MMAP,所以使用mmap内存映射文件; 然后把这个Map结构体添加到哈希表中,同时把这个Map添加到全局变量maps的链表头部。
mmc_unmap函数的步骤: 首先在哈希表中查找这个Map结构,如果没有找到,遍历全局变量maps链表寻找; 如果都没有找到或者找到后发现引用计数
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?