文档章节

Tinyhttpd 源码阅读笔记

r00txx
 r00txx
发布于 2016/07/11 19:51
字数 687
阅读 356
收藏 1

精选30+云产品,助力企业轻松上云!>>>

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/halokid/tinyhttpd_note,水平有限,如有错误请见谅,留言指正,交流学习,多谢

r00txx
粉丝 0
博文 26
码字总数 12726
作品 0
广州
架构师
私信 提问
加载中
请先登录后再评论。
TinyHTTP开源项目总结

  最近学习计算机网络知识,在查阅 Socket 网络实战项目时,发现了代码量仅500多行的轻量型 webserver,很兴奋,开始着手学习大神 J. David Blackstone 在1999年写的 Tinyhttpd,代码简洁精...

Caso_卡索
04/10
0
0
最适合新手学习的http服务器——tinyhttpd

tinyhttpd是一个非常小的http服务器,一个c文件,十多个函数,总共500多行代码,但清晰解释了web服务器的处理流程,可谓是麻雀虽小,五脏俱全。 我觉得拿tinyhttpd源码做例子对于一个想了解w...

arvik
03/31
0
0
9、Docker私有registry

Docker Registry分类 Docker 默认是使用https的,但是如果在自己得私有局域网中,你指明使用http也是可以的。 Registry主要的作用是托管镜像; 运行docker registry的方式一: registry运行在...

osc_7cexpmnb
2019/04/01
3
0
十个经典的C开源项目代码

开源世界有许多优秀的开源项目,我选取其中十个最优秀的、最轻量级的C语言的项目,希望可以为C语言开发人员提供参考。 十个最值得阅读学习的C开源项目代码 Webbench Tinyhttpd cJSON CMocker...

china_lx1
2018/07/15
0
0
7、Dockerfile详解

参考: https://www.imooc.com/article/details/id/25229 https://www.cnblogs.com/panwenbin-logs/p/8007348.html https://www.simapple.com/docker-dockerfile https://www.cnblogs.com/bo......

osc_c0qub4nv
2019/03/30
4
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenCV图像处理专栏十九 | 手动实现基于Canny算子的边缘检测

1. 前言 接着昨天手动构造Sobel算子实现检测,今天来讲讲如何手动实现Canny边缘检测。由于要实现这个算法的需要的先验知识比较多,所以在学习这个算法的实现之前我们先来学习一下用于图像二值...

BBuf
03/17
11
0
egg插件egg-ueditor:有些图片上传时出现“ENOENT:no such file or directory. stat”

问题: 在使用egg-ueditor上传图片时有些图片上传会出现“ENOENT:no such file or directory. stat”错误,发现是upload.js里通过fs.statSync读取上传完成的图片信息时抛出的错误 解决方法:...

qqzhxl
33分钟前
16
0
redis系列之——高可用(主从、哨兵、集群)

所谓的高可用,也叫HA(High Availability),是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。 如果在实际生产中,如果redis只部署一个节点,...

诸葛小猿
45分钟前
35
0
将个人博客迁移到云服务器上

前言 之前通过github 和coding 来搭建的个人博客,但是搜索引擎一直不是很好,并且总感觉不稳定,访问很慢。最近刚刚买了一个云服务器,所以就打算将个人博客迁移到云服务器上。 服务器环境准...

程序员爱酸奶
03/09
6
0
487068362 骗子

MT4系统整套源代码最新发布交流,可对接各种数据源也可以二次开发,包含安装部署流程文档和视频欢迎交流咨询骗子Q 487068362 系统不完善也拿出来卖,各种忽悠

hhaoren
51分钟前
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部