继前文分析了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 浅析相关推荐

  1. [原创] MAME架构、编译及配置浅析

    [摘要] 众所周知,M.A.M.E是目前世界上支持驱动最多.模拟精确程度最高.开发团队实力最强及影响力最为广泛的通用街机模拟器.本文以Mame 0.105b为例,尝试从编译配置和源码结构角度出发,简要 ...

  2. HTTP服务器的本质:tinyhttpd源码分析及拓展

    已经有一个月没有更新博客了,一方面是因为平时太忙了,另一方面是想积攒一些干货进行分享.最近主要是做了一些开源项目的源码分析工作,有c项目也有python项目,想提升一下内功,今天分享一下tinyhtt ...

  3. Vue解析--如何应对面试官提问

    近期不断面试中,面试官都会提一些关于Vue相关的源码和"全家桶"之类的问题.那么针对这些提问,我们应该如何更好应答呢?在这里我把对Vue的理解整理出来供大家来参考. 1.Vue是什 ...

  4. HTTP服务器的本质

    已经有一个月没有更新博客了,一方面是因为平时太忙了,另一方面是想积攒一些干货进行分享.最近主要是做了一些开源项目的源码分析工作,有c项目也有python项目,想提升一下内功,今天分享一下tinyhtt ...

  5. .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析

    .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析 .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析 作者:&;nbsp来自:网络 htt ...

  6. 浅析android手游lua脚本的加密与解密(番外篇之反编译的对抗)

    前言   去年在看雪论坛写了一篇<浅析android手游lua脚本的加密与解密>的精华文章,今年写一篇番外篇,将一些lua反编译对抗的内容整合一起,并以3个实例作为说明(包括2018腾讯游 ...

  7. 浅析C/C++编译流程

    更多博文,请看音视频系统学习的浪漫马车之总目录 C/C++编译 浅析C/C++编译本质 一篇文章入门C/C++自动构建利器之Makefile 升级构建工具,从Makefile到CMake 如果你愿意一 ...

  8. 浅析IBM i上C/C++应用程序编译调试方法

    软件调试对于编程人员来说有着非常重要的意义,应用程序功能的开发和完善是在不断调试中完成的.本文围绕IBM i上C/C++语言的编译调试问题进行分析和介绍.主要介绍两方面的内容:一是system i上C ...

  9. php编译优化,浅析使用Turck-mmcache编译来加速、优化PHP代码

    php_screw确实很不错,但是只能起到加密的作用,并没有加速和优化的作用. 下面我们来看看:Turck MMCache它的作用是通过对php代码的编译来加速.优化php代码,我们如果发布的php代 ...

最新文章

  1. 求数组的最大子数组和最大子数组的和
  2. 技术关注:搜索引擎经验
  3. mysql text查找性能_MySQL TEXT字段性能
  4. 【CF global1 D / CF1110D】 Jongmah
  5. TP3.2之WHERE组合条件处理
  6. 论文浅尝 | emrKBQA: 一个面向临床医疗问答的KBQA数据集
  7. 互联网、SaaS的技术挑战与机遇
  8. 前端有关vue的面试题
  9. 使用Chrome Frame,彻底解决浏览器兼容问题
  10. html 好看表格样式,简单但是好看的表格样式
  11. 2023华南农业大学计算机考研信息汇总
  12. 组合数学4-全排列生成算法
  13. Linux socket网络编程实现FTP服务器
  14. vue子组件mounted不执行_vue 页面回退mounted函数不执行的解决方案
  15. 前端学习——CSS布局
  16. 其實,硪想要的不是這種生活。
  17. 中国打桩设备行业运行态势与投资前景预测报告(新版)2022-2027
  18. 中软国际万人基地项目落户高新区软件新城(组图)
  19. 计算机IT专业排行,选专业9:计算机类各专业大学排名最新出炉
  20. 什么是JPA、JPA的基础实战

热门文章

  1. python获取图片坐标_python提取照片坐标信息的实例代码
  2. keep-alive 用法以及作用
  3. 数据分析:5W2H分析法
  4. 怎样判断一个股权众筹项目是否靠谱?
  5. Java正则表达式的应用(总结的十分到位)
  6. git 配置origin_git配置,以及简单的命令
  7. windows 路径 常用函数使用 UTF8-ascii ascii-UTF8 串转换
  8. 解决git取消ss代理后仍然访问代理端口的问题
  9. python 协程安全理解
  10. 女生学习软件测试怎么样?