文档章节

Tinyhttpd 源码阅读笔记

r00txx
 r00txx
发布于 2016/07/11 19:51
字数 623
阅读 151
收藏 1
点赞 1
评论 0

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
博文 18
码字总数 6439
作品 0
广州
架构师
超轻量型 HTTP 服务器--tinyhttpd

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

匿名 ⋅ 2012/06/30 ⋅ 3

几个c源码学习开源框架

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

ikel ⋅ 2016/05/03 ⋅ 0

Mina系列文章索引

写了很多关于Apache Mina的文章,为了方便大家阅读,我将关于mina的一些文章做点儿索引。 Mina官网资料----------------------------------------------------------------- Mina官网是学习m...

Gaischen ⋅ 2012/11/28 ⋅ 15

HTTP 服务器--Tiny httpd

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

兔之 ⋅ 2015/05/12 ⋅ 0

webbench 源码阅读注释笔记记录

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

r00txx ⋅ 2016/06/29 ⋅ 0

scruel/ML-AndrewNg-Notes

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

scruel ⋅ 05/07 ⋅ 0

开源的笔记软件--jnote

jnote是一个开源的笔记软件,类似于Evernote,wiz,麦库,界面也是参考他们做的.当初做只是为了做一个自己可以定制的笔记软件. 目前完成的功能: 1.新建日记,参考wiz的日记功能,这个功能很实用,可...

北鸟来了 ⋅ 2013/11/16 ⋅ 1

【杂谈】程序员在工作期间如何对自己进行深造

前言 众所周知,我们的工作存在下面几个特点 工作时间长 工作压力大 大部分时间处于劳动密集型,累人 部门沟通繁琐,累心 由于我们每天大部分时间都是在工作,所以一直会担心,怎么不断深造。...

diandianxiyu ⋅ 2017/12/27 ⋅ 0

冰冻三尺非一日之寒-自学篇 浅谈个人学习方法

昨晚还在看比赛(war3),小源跑过来问我明天1024,不写篇文章么,想想也是,1024这也算个热点,赶紧来蹭蹭,哈,开个玩笑。 上次谈了谈自己写博客的经历,那么这次就从自身出发来想想该如何...

lmj623565791 ⋅ 2016/10/24 ⋅ 0

以更简单的方式使用GDB调试Python程序

以更简单的方式使用GDB调试Python程序 张学程2017-12-221 阅读 Python 先决条件 本文演示环境 … 点赞 Python 作者:张学程 Studying , Coding 原文地址:以更简单的方式使用GDB调试Python程...

张学程 ⋅ 2017/12/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

tcp/ip详解-链路层

简介 设计链路层的目的: 为IP模块发送和接收IP数据报 为ARP模块发送ARP请求和接收ARP应答 为RARP模块发送RARP请求和接收RARP应答 TCP/IP支持多种链路层协议,如以太网、令牌环往、FDDI、RS-...

loda0128 ⋅ 38分钟前 ⋅ 0

spring.net aop代码例子

https://www.cnblogs.com/haogj/archive/2011/10/12/2207916.html

whoisliang ⋅ 54分钟前 ⋅ 0

发送短信如何限制1小时内最多发送11条短信

发送短信如何限制1小时内最多发送11条短信 场景: 发送短信属于付费业务,有时为了防止短信攻击,需要限制发送短信的频率,例如在1个小时之内最多发送11条短信. 如何实现呢? 思路有两个 截至到当...

黄威 ⋅ 昨天 ⋅ 0

mysql5.7系列修改root默认密码

操作系统为centos7 64 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2、重启 mysqld 服务:systemctl restart mysql...

sskill ⋅ 昨天 ⋅ 0

Intellij IDEA神器常用技巧六-Debug详解

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的...

Mkeeper ⋅ 昨天 ⋅ 0

zip压缩工具、tar打包、打包并压缩

zip 支持压缩目录 1.在/tmp/目录下创建目录(study_zip)及文件 root@yolks1 study_zip]# !treetree 11└── 2 └── 3 └── test_zip.txt2 directories, 1 file 2.yum...

蛋黄Yolks ⋅ 昨天 ⋅ 0

聊聊HystrixThreadPool

序 本文主要研究一下HystrixThreadPool HystrixThreadPool hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java /** * ThreadPool used to executed {@link Hys......

go4it ⋅ 昨天 ⋅ 0

容器之上传镜像到Docker hub

Docker hub在国内可以访问,首先要创建一个账号,这个后面会用到,我是用126邮箱注册的。 1. docker login List-1 Username不能使用你注册的邮箱,要用使用注册时用的username;要输入密码 ...

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

SpringBoot简单使用ehcache

1,SpringBoot版本 2.0.3.RELEASE ①,pom.xml <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELE......

暗中观察 ⋅ 昨天 ⋅ 0

Spring源码解析(八)——实例创建(下)

前言 来到实例创建的最后一节,前面已经将一个实例通过不同方式(工厂方法、构造器注入、默认构造器)给创建出来了,下面我们要对创建出来的实例进行一些“加工”处理。 源码解读 回顾下之前...

MarvelCode ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部