文档章节

Tinyhttpd 源码阅读笔记

r00txx
 r00txx
发布于 2016/07/11 19:51
字数 623
阅读 159
收藏 2

Tinyhttpd 源码阅读笔记
 

Tinyhttpd是一个超轻量级的 webserver, 对于了解 HTTP 协议, web服务本质有很好的参考价值

程序流程
从 main 函数入口开始
1. 分析HTTP信息头,解释客户端传递过来的请求方法, URL, 长度等信息
2. 判断文件是否存在, 不存在则返回 not_found, 存在则判断是否为 CGI脚本
3. 假如不是 CGI 脚本,则执行 CAT 函数, 类似linux 的 cat 命令,直接显示文件文本
4. 假如是 CGI 脚本, 则分下面几步走

   A  设置环境变量( 在程序里面几乎毫无用处,可能是为了执行 CGI 脚本而准备的)

   B   定义两个管道分别是  cgi_input (对应 STDIN ), cgi_output (对应 STDOUT)
  

   C   fork() 进子进程, 子进程把 STDIN  导向到 cgi_input[0], 把 STDOUT  导向           到 cgi_output[1], execl 执行CGI 脚本,则输出到  STDOUT, 数据写入 cgi_output[1], 子进程结束, 进入父进程

   D   父进程等待子进程的退出, 然后进入到父进程, 如果是 POST 方法, 把 POST 的数据写入到  cgi_input[1] 的管道(其实这个处理似乎没多大意义,本来  tinyhttpd 对于处理 POST 数据这块还不成熟, 可以忽略这个逻辑), 父进程重点逻辑主要是, 读取 cgi_output[0] 的数据, 也就是在 子进程 那里执行 CGI 脚本写入的数据, 然后 把这些数据 发送 给客户端

 

信息流处理过程

 

程序算法特点

利用linux管道(pipe)进行 子进程 与  父进程 之间的信息传递(也就是通常说的通信), 管道有两端, 可以看作是一个储存水的“水管”, 当水进来的时候,要先关闭水出去的一端, 当水出去的时候,要先管理水进来的一端, 实际上只是储存一个“个体完整”信息的一种方式, 通常用一个 整型数组来初始化管道, 例如: int cgi_output[2] , 0 端为读, 1 端为写

有兴趣的同学可以扩展 tinyhttpd 执行 CGI 那一段逻辑, 比如执行 PHP, 本身 php-cgi 已经做了 HTML 输出处理的, 其实假如是执行 PHP 文件,可以直接调用  php-cgi a.php 来输出HTML

源码注释的链接地址为 https://github.com/r00tjimmy/tinyhttpd_note,水平有限,如有错误请见谅,留言指正,交流学习,多谢

© 著作权归作者所有

共有 人打赏支持
r00txx
粉丝 0
博文 20
码字总数 7588
作品 0
广州
架构师
私信 提问
超轻量型 HTTP 服务器--tinyhttpd

tinyhttpd 是一个超轻量型 Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,用来学习非常不错,可以通过阅读这段代码理解一个 Http Server 的本质。 建议源...

匿名
2012/06/30
30.9K
3
几个c源码学习开源框架

内容是别人推荐的,只是转载而已 WebbenchWebbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以...

ikel
2016/05/03
153
0
HTTP 服务器--Tiny httpd

Tinyhttpd 是一个支持多端口监听的 HTTP 服务器,基于 QT QTcpServer 封装。 目录结构 [src]├── LICENSE #MIT许可证├── README.md #使用说明├── tinyhttpd.pro #工程文件 主程序 ├...

兔之
2015/05/12
2.2K
0
webbench 源码阅读注释笔记记录

webbench 源码阅读笔记 webbench V 1.5 版本源码阅读注释笔记, 在原来源码的基础上进行中文注释, 提出自己的见解,记录笔记 流程 从 main 函数入口开始 解释命令行参数 初始化结构体,变量...

r00txx
2016/06/29
63
0
scruel/ML-AndrewNg-Notes

ML-AndrewNg-Notes 课程地址: https://www.coursera.org/learn/machine-learning (吴恩达老师在 Coursera 上的机器学习公开课) 本项目包含课程中的课后作业以及笔记: 笔记(notes)都为中文...

scruel
05/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

当S8遇上边缘计算:谈阿里云ENS对直播业务场景的支撑

摘要: 类似S8赛事这样的大型活动直播的特点和技术挑战是什么?为什么业务要下沉到边缘?自建边缘节点和与云服务厂商合作到底该如何选择?边缘节点服务(ENS)又是如何进行技术支撑?提供的针...

阿里云官方博客
5分钟前
1
0
supervisor安装配置

supervisor安装配置 安装 wget -c https://files.pythonhosted.org/packages/44/60/698e54b4a4a9b956b2d709b4b7b676119c833d811d53ee2500f1b5e96dc3/supervisor-3.3.4.tar.gztar -zxvf su......

jackmanwu
15分钟前
1
0
laravel定时器

民间高手: https://blog.csdn.net/zhezhebie/article/details/79205414 官方文档: https://laravel-china.org/docs/laravel/5.5/scheduling/1325...

vio小黑
38分钟前
0
0
Apache Zeppelin安装及使用

Apache Zeppelin官网:http://zeppelin.apache.org/ Apache Zeppelin介绍:A web-based notebook that enables interactive data analytics. You can make beautiful data-driven, interacti......

GordonNemo
39分钟前
4
0
关于python开发多个项目环境配置Anaconda

关于Anaconda用来管理Python的包和环境 下载并安装Anaconda 创建项目:windows键+R ==> 进入CMD => 输入conda create -n 项目名称 python=3 conda info -e 查看项目以及项目所在的位置,默认...

上官清偌
40分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部