TinyHttp学习(一): 基础知识学习和该项目的需求

TinyHttp是一个非常棒的学习项目, 短短500行便实现了一个轻量级的HTTP服务器,对于我们学习网络编程和HTTP非常有帮助。

这里先提供一下学习该项目必备的基础知识,着重面向对HTTP和socket编程毫无概念的新手朋友们。


一、HTTP协议基础

    1.HTTP消息格式

通常HTTP消息包括客户机向服务器的 请求消息 和服务器向客户机的 响应消息
这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。
每个头域由一个 域名,冒号(:)和域值 三部分组成。
域名是大小写无关的
头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。

典型的HTTP请求格式包括 请求行,请求头,请求体三个部分。如下所示,其中\r\n只是我特意标出来的换行符,实际上并不显示。
  POST/GET  http://google.com  HTTP/1.1\r\n
  Accept:*/*\r\n
  Pragma:  no -cache\r\n
  Cache-Control:  no -cache\r\n
  \r\n

    【请求体】


其中第一行就是请求行,    其格式包括 请求方法、请求url地址和协版本。

第2-4行是请求头, 分别代表了4个头域。头域通常是Web服务器去使用的。

请求头后跟着一个空行, 接下来就是请求体。请求体没有固定格式, Web服务器通常不参与请求体的解析,由用户自己完成。


典型的HTTP响应格式包括 响应行,响应头,响应体三个部分。如下所示

HTTP/1.1 200 OK\r\n
Content-Type: text/html \r\n
Server: jdbhttpd/0.1.0\r\n
\r\n
【响应体】

第一行就是响应行,  响应成功就会回复200,  响应不成功会回复404等错误代号,

第2-3行就是响应头。  Content-Type指数据类型,一般为text类型,有时是一些图片或者app类型时,要修改一下。

一个空行之后,就是响应体。


2.   HTTP响应过程

    通常,先是由客户端(浏览器)发出HTTP请求

    发出后与服务器建立一个TCP连接

    服务器先判断请求方法是GET还是POST还是其他。

    接着读取url,url代表了该请求要访问的文件或者接口。 url有时候可以为 url?query_string,  即中间隔一个问号,后面跟着一些请求参数。

    接着再读取响应头,并根据每个响应头做出相应的措施。

    请求体一般由用户处理。


二、网络编程基础

    这里给出接下来TinyHttp会用到的所有函数,届时可以在这里进行比对,但不会太详细地去介绍,具体的请参阅《UNIX高级编程》和《UNIX网络编程》两本书

网络编程相关函数

socket
bind
listen
getsockname
htons
ntohs
accept

IO以及多线程相关:

fgets
recv
write
pipe
fork
dup
pthread_create


三、  CGI脚本

CGI代表Common Gateway Interface(通用网关界面),它使在网络服务器下运行外部分应用程序(或网关)成为可能。CGI-BIN 目录是存放CGI脚本的地方。这些脚本使WWW服务器和浏览器能运行外部程序,而无需启动另一个原因程序。 

它是运行在Web服务器上的一个程序,并由来自于浏览者的输人触发。CGI是在HTTP服务器下运行外部程序(或网关)的一个接口,它能让网络用户访问远程系统上的使用类型程序,就好像他们在实际使用那些远程计算机一样。

CGI应用程序的工作原理是这样的: 

1.浏览器通过HTML表单或超链接请求指上一个CGI应用程序的URL。

2.服务器收发到请求。

3.服务器执行指定所CGI应用程序。

4.CGI应用程序执行所需要的操作,通常是基于浏览者输人的内容。

5.CGI应用程序把结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页)。

6.网络服务器把结果返回到浏览器中。


四、 TinyHttp的实现需求

先理解tinyhttp要做什么。这里的需求用于希望不直接借助源码,先自己用C语言写一遍的同学。

实现需求:

    1. 使用多线程服务器模型,  服务器时刻监听, 每当收到一个请求, 则新建一个线程来处理这个请求。

    2. 从客户端读取消息时,每次读一行

        从第一行中,判断出方法是GET还是POST

        如果是GET,且没有url?qurey_string 形式,即没有携带请求参数时,且请求的文件是非执行文件, 则直接返回url中所对应的文件数据。  例如url为/lsx/data/blog.txt    ,则找到该文件blog.txt, 并给客户端发送响应消息。  注意,响应消息要先发响应行,即200 OK, 再发响应头, 发几个重要的头部即可,不需要都发。   空行之后,再发送这个文件的数据即可。

        如果Get带有请求参数,或者GET是可执行文件, 或者为POST,则一定会调用一个的处理脚本,来返回一串数据。我们需要做的就是调用那个处理脚本,然后将脚本所输出的内容(通常为标准输出,这时候我们需要重定向)发回到客户端(不要遗漏响应行和响应头)

3.加上响应的错误消息,例如文件不存在等错误返回。



fgetsdupforkpiperecvwrite

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值