小型HTTP服务器

版权声明:本文为博主原创文章,允许转载,转载请注明出处。 https://blog.csdn.net/LF_2016/article/details/69944160

本文的重点是介绍HTTP服务器的框架结构,旨在了解HTTP服务器的工作流程,所以我们在下面我们会实现一个多线程的HTTP/1.0版本服务器,这个HTTP服务器主要支持GET和POST方法。

在实现HTTP服务器之前,我们首先要了解HTTP协议,CGI协议等:
http协议

一、web框架的原理图
如果使用非CGI方式处理浏览器的请求的话很简单,服务器直接将浏览器请求的资源返回即可。下面给出CGI方式为浏览器服务的框架:
这里写图片描述

二、多线程http服务器工作方法
1、http/1.0版本的服务器采用的是短连接。
我们要搭建的是多线程服务器,并且使用短连接,所以每当建立一个连接之后,就创建一个线程去处理这个请求,并将这个线程设置成分离状态,然后主线程继续处于监听状态。当线程处理完这个请求之后,然后断开连接。这样一来一回就处理完一个请求。

2、实现支持GET和POST方法的小型http服务器。
GET方法:如果GET方法只是简单的请求一份资源,而不传递参数的话则由服务器直接将资源返回即可。如果GET方法的url中带有参数的话,则就要使用CGI模式进行处理。
POST方法:POST方法要使用CGI模式进行处理。POST的参数在消息正文中出现。
这里写图片描述
那么如何判断请求的方法呢?
由于请求方法在http请求报文中的第一行,所以我们需要按行读取第一行,然后判断是那种方法,并且判断是不是CGI模式。

3、非CGI模式
当我们判断出是GET请求时,并且url中没有参数的时候,就是用非CGI模式。非CGI模式处理起来比较简单,首先我们要解析出请求路径,判断请求的是不是合法资源,如果是的话,我们就返回这个资源。

4、CGI模式
当是CGI模式处理请求的时候,我们要要将fork一个子进程,对子进程exec替换CGI程序。在这过程中,我们使用pipe进行父子进程之间的通信。所有需要的参数在exec之前,我们都将这些参数导出为环境变量,这样就算exec的话,子进程还是能够通过环境变量获取所需的参数。

三、程序主要逻辑
这里写图片描述

四、代码实现
这里写图片描述

cgi_bin:存放CGI程序的目录
configure.sh:配置脚本,自动生成Makefile。
thttp_ctl.sh:控制http服务器启停的脚本
conf:配置文件目录,里面有一个thttpd.conf文件,存放的是http服务器的IP和PORT。
log:日志目录。
wwwroot:web根目录,里面存放的是服务器的资源和CGI程序。

main.c
thttpd.c
thttpd.h
这三个是服务器的代码。

http服务器代码

例1:显示用python爬取的段子。
python爬虫代码:
爬取笑话

这里写图片描述

这里写图片描述

例2:编写一个CGI程序,浏览器提交两个数据,通过cgi_math程序运算后返回结果 。

这里写图片描述

这里写图片描述

这里写图片描述

展开阅读全文

没有更多推荐了,返回首页