TinyHTTPd 编译及 HTTP 浅析
继前文分析了TinyHTTPd源码。这里给出修改地方,然后运行下该项目。之后结合该开源项目介绍下 HTTP 涉及的部分。
编译环境:Deepin Linux 2014.2,内核版本 Linux 3.13.0,GCC 4.8.2
修改处(所指位置为源码位置):因为现在 Linux 已经支持 pthread 了,所以不需要按照它给定的英文注释那样修改代码了。
1、33行改为 void* accept_request(void *); 相应的该函数的实现也要做出修改:
void* accept_request(void *pclient)
{int client = *(int*)pclient;……unimplemented(client);return NULL;//r77……close(client);//r128return NULL;//
}
返回值也得相应修改,上面的修改主要是为了适应 pthread_create() 函数参数。(参见《Unix 高级环境编程》)
2、438行和483行(源码436行和481行)的变量类型改为 socklen_t
3、497行(源码495行)改为 if (pthread_create(&newthread , NULL, accept_request, (void*)&client_sock) != 0)
4、Makefile 文件中编译的一行改为 gcc -W -Wall -o httpd httpd.c -lpthread 后面要加上-lpthread 依赖,去掉对libsocket的依赖。
然后 make,可以得到运行端口号,然后在浏览器中输入 localhost:运行端口号,就可以看到下面的结果。
HTTP
TinyHTTPd 是一个超轻量级的 HTTP Server。源码里面自然涉及到相应的HTTP,尤其是 accept_request 函数。这里简单的介绍下HTTP协议。
uri 和 url
URI 是统一资源标识符,某个协议方案表示的资源的定位标识符。相比之下,我们更熟悉 URL(统一资源定位符),它就是Web 浏览器访问Web页面时需要输入的网页地址。比如http://hacker.jp/ 就是 URL。
URI 用字符串标识某一互联网资源,而URL 表示资源的地点(互联网上所处的位置,你输入浏览器的网址,标明了互联网上所处的位置)
HTTP 协议使用 URI 定位互联网上的资源,正是因为 URI 的特定功能,在互联网上任意位置的资源都能访问到(如果没有GFW)
HTTP 协议用于客户端和服务器端之间的通信,在两台计算机之间使用 HTTP 协议通信时,在一条通信线路上必定有一端是客户端,另一端则是服务器端。HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返回,换句话说,肯定是先从客户端开始建立通信的,服务器端没有接收到请求之间不会发送响应,在TinyHTTPd中,服务器端是在接收到客户端的请求之后才做出的响应。
告知服务器意图的 HTTP 方法
体现在TinyHTTPd中的为 GET 和 POST method。
GET:获取资源
GET 方法用来请求访问已被 URI 识别的资源。指定的资源进服务器端解析后返回响应内容。换言之,如果请求的资源是文本(静态页面请求),那就保持原样返回;如果是像CGI 那样的程序(动态页面请求),则返回经过执行后的输出结果。
POST:传输实体主体
POST 的主要目的是用来传输实体的主体,不是获取响应的主体内容
本博文插画来源于《图解HTTP》(日本)。体外说一下,我发现日本的技术类书籍,一般写的比较简单易懂,有的甚至像儿童读物那种,以前读过几本电子类的书籍大抵是这样,各种插画,可以在轻松的条件下阅读,而美国的则不同,比较严谨,系统,专业化,需要静下心来细细研读。中国的技术类书籍,只要是大学教授写的,呵呵,你懂的。
其余几种方法TinyHTTPd中没涉及到,这里就不赘述了。
HTTP报文
请求端(客户端)的HTTP报文叫做请求报文,响应段(服务器端)的叫做响应报文。HTTP报文本身是由多行(CR+LF作换行符'\r\n')数据构成的字符串文本
请求报文和响应报文的结构
看看左图的响应报文,状态行:协议版本+状态码+状态码的原因短语,下面是响应首部字段,通用首部字段,实体首部字段等信息,使用首部字段是为了给浏览器和服务器提供报文主体大小,所使用的语言,认证信息等内容,最下面的报文主体即网页内容。你打开浏览器,右键查看网页源代码,显示的这一部分就是报文内容。
下面用 wireshark 实时抓包一下请求 www.baidu.com 的数据包
上面同样标明各类信息,如首部字段信息,请求URI等。
TinyHTTPd 编译及 HTTP 浅析相关推荐
- [原创] MAME架构、编译及配置浅析
[摘要] 众所周知,M.A.M.E是目前世界上支持驱动最多.模拟精确程度最高.开发团队实力最强及影响力最为广泛的通用街机模拟器.本文以Mame 0.105b为例,尝试从编译配置和源码结构角度出发,简要 ...
- HTTP服务器的本质:tinyhttpd源码分析及拓展
已经有一个月没有更新博客了,一方面是因为平时太忙了,另一方面是想积攒一些干货进行分享.最近主要是做了一些开源项目的源码分析工作,有c项目也有python项目,想提升一下内功,今天分享一下tinyhtt ...
- Vue解析--如何应对面试官提问
近期不断面试中,面试官都会提一些关于Vue相关的源码和"全家桶"之类的问题.那么针对这些提问,我们应该如何更好应答呢?在这里我把对Vue的理解整理出来供大家来参考. 1.Vue是什 ...
- HTTP服务器的本质
已经有一个月没有更新博客了,一方面是因为平时太忙了,另一方面是想积攒一些干货进行分享.最近主要是做了一些开源项目的源码分析工作,有c项目也有python项目,想提升一下内功,今天分享一下tinyhtt ...
- .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析
.NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析 .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析 作者:&;nbsp来自:网络 htt ...
- 浅析android手游lua脚本的加密与解密(番外篇之反编译的对抗)
前言 去年在看雪论坛写了一篇<浅析android手游lua脚本的加密与解密>的精华文章,今年写一篇番外篇,将一些lua反编译对抗的内容整合一起,并以3个实例作为说明(包括2018腾讯游 ...
- 浅析C/C++编译流程
更多博文,请看音视频系统学习的浪漫马车之总目录 C/C++编译 浅析C/C++编译本质 一篇文章入门C/C++自动构建利器之Makefile 升级构建工具,从Makefile到CMake 如果你愿意一 ...
- 浅析IBM i上C/C++应用程序编译调试方法
软件调试对于编程人员来说有着非常重要的意义,应用程序功能的开发和完善是在不断调试中完成的.本文围绕IBM i上C/C++语言的编译调试问题进行分析和介绍.主要介绍两方面的内容:一是system i上C ...
- php编译优化,浅析使用Turck-mmcache编译来加速、优化PHP代码
php_screw确实很不错,但是只能起到加密的作用,并没有加速和优化的作用. 下面我们来看看:Turck MMCache它的作用是通过对php代码的编译来加速.优化php代码,我们如果发布的php代 ...
最新文章
- 求数组的最大子数组和最大子数组的和
- 技术关注:搜索引擎经验
- mysql text查找性能_MySQL TEXT字段性能
- 【CF global1 D / CF1110D】 Jongmah
- TP3.2之WHERE组合条件处理
- 论文浅尝 | emrKBQA: 一个面向临床医疗问答的KBQA数据集
- 互联网、SaaS的技术挑战与机遇
- 前端有关vue的面试题
- 使用Chrome Frame,彻底解决浏览器兼容问题
- html 好看表格样式,简单但是好看的表格样式
- 2023华南农业大学计算机考研信息汇总
- 组合数学4-全排列生成算法
- Linux socket网络编程实现FTP服务器
- vue子组件mounted不执行_vue 页面回退mounted函数不执行的解决方案
- 前端学习——CSS布局
- 其實,硪想要的不是這種生活。
- 中国打桩设备行业运行态势与投资前景预测报告(新版)2022-2027
- 中软国际万人基地项目落户高新区软件新城(组图)
- 计算机IT专业排行,选专业9:计算机类各专业大学排名最新出炉
- 什么是JPA、JPA的基础实战