一个简单的Web服务器的例子SHTTPD

上传人:宝路 文档编号:2113615 上传时间:2017-07-20 格式:PPT 页数:48 大小:811.06KB
返回 下载 相关 举报
一个简单的Web服务器的例子SHTTPD_第1页
第1页 / 共48页
一个简单的Web服务器的例子SHTTPD_第2页
第2页 / 共48页
一个简单的Web服务器的例子SHTTPD_第3页
第3页 / 共48页
一个简单的Web服务器的例子SHTTPD_第4页
第4页 / 共48页
一个简单的Web服务器的例子SHTTPD_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《一个简单的Web服务器的例子SHTTPD》由会员分享,可在线阅读,更多相关《一个简单的Web服务器的例子SHTTPD(48页珍藏版)》请在金锄头文库上搜索。

1、第18章 一个简单的Web服务器的例子SHTTPD,在第六章的用户空间网络程序简介中对HTTP协议进行了简单的介绍,本章将实现一个简单的Web服务器程序SimpleHTTPDemo,简称SHTTPD。这个Web服务器可以实现简单的用户配置、静态网页相应等功能。按照如下步骤进行设计和编写程序。定义需求,明确需求定义。对需求进行分析,明确实现的方式和关键的问题,进行模块设计按照模块设计,进行编码最后进行编译和测试,18.1 SHTTPD的需求分析,Web服务器SHTTPD可以实现动态配置、多客户访问、CGI支持、支持HTTP/1.0版本,最终能实现简单的可用型Web服务器,多种浏览器可以正常访问S

2、HTTPD上的网页。,18.1.1 SHTTPD启动参数可动态配置的需求,服务器dHTTP可以动态配置启动参数,例如服务器的侦听端口、支持客户端并发访问的数量、超时时间的设置、访问web网页的路径等。采用参数配置和文件配置两种支持方式,在优先级上,参数配置比文件配置的优先级高,参数配置的选项值会覆盖文件配置的选项。1命令行参数配置2文件配置,18.1.1 SHTTPD启动参数可动态配置的需求,18.1.2 SHTTPD的多客户端支持的需求,SHTTPD支持多个客户端的并发连接,在同一时刻允许多个客户端同时成功获得服务器上的网页资源,这是现代服务器的基本属性。SHTTPD启动时的处理单元初始化了

3、两个,并发访问数量为2,当客户端增加时,会自动根据现场情况增加处理单元,最大为4个。,18.1.2 SHTTPD的多客户端支持的需求,18.1.3 SHTTPD支持方法的需求,HTTP协议中定义了八种方法,用来来表示对指定数据的操作的性质和特点:HEAD方法。GET方法。POST方法。PUT上传指定资源DELETE 删除指定资源TRACE方法。OPTIONS方法。CONNECT方法。HTTP服务器至少应该实现Get和Head方法,可能的话,也实现OPTIONS方法。,18.1.4 SHTTPD支持的HTTP协议版本的需求,超文本传输协议从开始出现到现在已经演化出了很多版本,它们中的大部分都是向

4、下兼容的。在RFC 2145中描述了HTTP版本号的用法。客户端在请求的时候先告诉服务器客户端所采用的HTTP协议版本号,而后者则在响应中采用相同或者更早的协议版本。目前版本有0.9、1.0和1.1版本。HTTP/0.9版本HTTP/1.0版本HTTP/1.1版本,18.1.5 SHTTPD支持头部的需求,HTTP协议的头部有很多内容,本书中仅介绍几个常用的头域。主机头域:参考头域:时间头域:范围头域:用户代理头域:,18.1.6 SHTTPD定位URI的需求,URI是Universal Resource Identy的简写,是同一资源标识符的意思,它是一种格式化的字符串,通过名称、地址或者其

5、他别的特征来确定网络资源的位置。URI已经广为人知,例如WWW地址、通用文件标识符、统一资源定位器(URL)、统一资源名称(URN)等。1URI的一般语法2HTTP URL3URI 比较,18.1.7 SHTTPD支持CGI的需求,CGI脚本是任何运行在Web服务器上的程序,CGI是Common Gateway Interface的缩写,“通用网关接口”的意思。简单的讲,CGI脚本是一个可以运行在Web服务器上的程序,有浏览器的输入触发。使用这种脚本,可以执行服务器端的任何操作,但CGI脚本通常用于构建服务器程序和其他系统程序,例如数据库之间的桥梁。CGI脚本可能是一个脚本,或者一个二进制可执

6、行程序,也就是说它可能是一个编译好的程序或者批命令文件或者其他可执行的东西。它的一个共同的特性是可以执行并将结果反馈回来。CGI脚本可以利用如下的两种方法使用:作为一个表单的ACTION的响应对象的URL。,18.1.8 SHTTPD错误代码的需求,错误代码,即状态码是试图理解和满足请求的三位数字的整数码。状态码的第一位数字定义应答类型,后两位数字没有任何类型任务。第一位数字有五种值:-1xx: 报告的,接收到请求,继续进程。-2xx 成功,操作成功的收到。-3xx 重发,为了完成请求,必须采取进一步措施。-4xx 客户端出错,请求包括错的顺序或不能完成。-5xx 服务器出错,服务器无法完成显

7、然有效的请求。,18.2 SHTTPD的模块分析和设计,要实现SHTTPD服务器,需要对服务器的架构和模块进行仔细的分析,例如客户、服务器模式的选型,CGI的实现方法、命令行脚本的解析等。本节对18.1小结中的需求进行仔细的分析,提供一种解决的方法。,18.2.1 SHTTPD的主函数,为了更好的展示web服务器的架构,SHTTPD的主函数设计为十分简单的模型。主函数仅仅调用必要的功能函数,具体细节有各功能函数实现。主函数完成四个部分的功能:初始化服务器配置参数、套接字初始化的一些操作、运行调度函数、挂接信号处理函数。,18.2.1 SHTTPD的主函数,18.2.2 SHTTPD命令行解析的

8、分析设计,服务器SHTTPD的命令行解析,需要进行大量的命令行字符串解析,程序设计起来比较麻烦。1函数getopt_long介绍2SHTTPD中的命令行选项定义,18.2.2 SHTTPD命令行解析的分析设计,18.2.3 SHTTPD配置文件解析的分析设计,服务器SHTTPD的配置文件格式与一般的配置文件格式基本一致,即可以以#开头的注释行,或者按照关键字=值的格式书写。格式如下:#注释|空格关键字空格=空格value,18.2.3 SHTTPD配置文件解析的分析设计,18.2.4 SHTTPD的多客户端支持的分析设计,服务器SHTTPD的多客户端支持模块为此程序的主处理模块。在此模块中进行

9、客户端连接的处理、请求数据的接收、响应数据的发送和服务线程的调度。模块的核心部分采用线程池的服务器模型。,18.2.4 SHTTPD的多客户端支持的分析设计,18.2.5 SHTTPD头部解析的分析设计,HTTP请求的格式如下所示:METHOD URI HTTP/1|0.9|0|1rn主要包含方法、URI、HTTP的版本,目前SHTTPD服务器所支持的方法仅为GET,因为GET方法可以满足大部分的Web应用。HTTP的版本,可以取值为0.9、1.0或者1.1。可以用如下的方法可以获得HTTP版本的主版本号和次版本号:sscanf(p,HTTP/%lu.%lu,& major, &minor);

10、,18.2.6 SHTTPD对URI的分析设计,URI是客户端请求主机网络资源的位置,对于URI的分析主要包含如下需要特别进行注意的部分:资源位置的确定。请求主机的位置以“/”开始,其后为相对路径,要注意请求的路径中使用“./././”的形式取得请求范围的扩大。资源位置的最后一个“/”之后的字符串为实际请求的文件名,需要根据此文件名判定请求资源的类型,例如请求一个常规文件、请求一个目录来获得目录下面所有文件的列表、请求CGI等。URI资源中的“保留”和“危险”字符集。此字符集中的字符字符等同于它们的“% HEX HEX”编码,即对于一个以“%”开头的字符,需要进行转换后使用其正真的值。,18.

11、2.7 SHTTPD支持方法的分析设计,服务器dHTTP的方法仅支持GET,使用GET方法可以满足大多数的静态网页的应用。在对客户端的请求进行解析获得请求的方法为GET后,服务器端的方法实现主要分为如下几个部分:头部信息的组织。文件内容的发送。,18.2.8 SHTTPD支持CGI的分析设计,Web服务器中的CGI是一段外部程序,它可以动态的生成代码,并可以接收输入的参数。支持CGI主要分为如下几个部分:CGI运行程序和输入参数的分析;一个进程运行CGI程序,将CGI程序的输出发给与客户端通信的进行;与客户端通信的进行生成头部信息,并将CGI运行进行的输出发给客户端;CGI程序及参数的分析用于

12、得到CGI程序和CGI程序运行时的输入参数。,18.2.8 SHTTPD支持CGI的分析设计,18.2.9 SHTTPD错误处理的分析设计,当用户的请求发生错误,或者服务器端发生错误以及网络传输过程中发生错误时,需要给客户端发送合适的错误信息,应该包含错误代码和错误含义。发送给出错客户端的信息格式为:HTTP/主版本.副版本 错误代码 错误信息rnContent-Type:内容类型rnContent-Length:内容长度rnrn错误信息,18.2.9 SHTTPD错误处理的分析设计,18.3 SHTTPD各模块的实现,Web服务器SHTTPD中实现的模块有命令行解析、文件配置解析、多客户端支

13、持、URI解析、请求方法的解析、请求方法的响应、CGI的支持、HTTP版本的支持、内容类型的实现、错误的处理方法、对目录列表的显示以及主函数的实现,本节对上述的实现方法进行介绍。,18.3.1 SHTTPD命令行解析的实现,SHTTPD可以根据用户的命令行输入进行服务器的配置。在解析用户输入的参数后,对默认参数进行修改来启动服务器。1配置文件的结构2命令行解析结构3命令行解析代码,18.3.2 SHTTPD文件配置解析的实现,服务器SHTTPD配置文件的优先级最高,对其进行解析后的值覆盖其他配置部分的值。单行配置文件的格式为:空格#注释|空格关键字空格=空格value,18.3.3 SHTTP

14、D的多客户端支持的实现,服务器SHTTPD的多客户端支持框架的函数主要为Worker_ScheduleRun()和函数Worker_ScheduleStop(),这两个函数通过对结构struct worker_opts进行管理来控制线程的状态。结构struct worker_opts的原型如下:struct worker_optspthread_t th;/*线程的ID号*/int flags;/*线程状态*/pthread_mutex_t mutex;/*线程任务互斥*/struct worker_ctl *work;/*本线程的总控结构*/;,18.3.4 SHTTPD所请求URI解析的实

15、现,服务器SHTTPD中URI解析主要包含“有害”字符的替换,即将以“%”开始的字符进行转换。例如将“%20”转换为“空格”。,18.3.5 SHTTPD方法解析的实现,服务器SHTTPD请求方法的解析比较简单,使用比较字符串的方法。建立一个表示请求方法的结构数组,逐个比较客户端请求方法的字符串和数组中成员请求方法的异同。请求方法的结构如下,ptr表示请求方法的名称,len表示请求方法的长度,type表示请求方法的类型:typedef struct vec charintlen;SHTTPD_METHOD_TYPE type;vec;,18.3.6 SHTTPD响应方法的实现,服务器SHTTP

16、D可以识别的方法为GET、PUT、POST、DELETE和HEAD等,但仅实现了GET方法。在请求方法分析中已经可以获得客户端请求的方法,在响应中,只要匹配其方法就可以了。,18.3.7 SHTTPD支持CGI的实现,CGI支持的实现主要包含CGI命令获取、CGI参数获取、管道进程间连接、主进程从CGI进程读取数据和发送数据、CGI进程执行并发送结果给主进程。,18.3.8 SHTTPD支持HTTP协议版本的实现,服务器SHTTPD支持的HTTP协议版本为0.9、1.0和1.1,当协议的版本不为此范围时,返回错误值505,表示不支持的服务器版本。代码如下:len -= pos -p;p = pos;sscanf(p,HTTP/%lu.%lu,&req-major, &req-minor);if(!(req-major = 0 & req-minor = 9)|/*0.9*/(req-major = 1 & req-minor = 0)|/*1.0*/(req-major = 1 & req-minor = 1)/*1.1*/retval = 505;goto EXITRequest_Parse;,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 教育学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号