第一章概述如今,上网已成为最热门话题,通过Internet,我们既能获取信息又能发布信息,而迅速发展的Web技术更是给Internet应用提供了一个很好的发展方向。当今的许多应用都是基于web技术的,如电子商务、视频会议、远程医疗诊断等。由于HTMI语言的标准统一性,只要在设备里建立一个微型web服务器,人们就可以使用现有的Web浏览器与该设备进行双向交互、接收或发送信息。因此,针对微型web服务器的研究和应用,具有重大的意义,它为我们管理、控制和监测各种各样的设备提供了一个很好的途径一基于Internet,也就是说,只要设备接入了Internet,我们就可以在世界上的任何地方十分方便地控制、操纵那些配备有微型Web服务器的设备。一般来说,Web服务器通常由以下几个部分组成:(1)服务器初始化部分.这部分主要完成Web服务器的初始化工作,如建立守护进程、创建TCP套接字、绑定端口、将TCP套接字转换成侦听套接字,进入循环结构,等待接收用户浏览器连接.(2)接收客户端请求.由于客户端请求以文本行的方式实现,所以服务器一般也以文本行为单位接收.(3)解析客户端请求.这部分工作比较复杂,需要解析出请求的方法、URL目标、可选的查询信息及表单信息.如果请求方法为HEAD,则简单地返回响应首部即可;如果方法是GET,则首先返回响应首部,然后将客户端请求的URL目标文件从服务器磁盘上读出,再发送给客户端。(4)发送响应信息之后,关闭与客户机的连接.在了解WEB服务器的基本结构后,就需要更进一步了解如何实现服务器与协议的连接,那就需要用到CSOCK,这也是本次设计中的核心与重点。通过SOCKET,利用VC++编程就能基本实现了简易的WEB服务器的设计,并能在window系统下运行良好的运行,实现web服务器基本功能:页面访问请求响应、HTML文件的解析以及数据发送。第二章WEB服务体系结构2.1WEB服务器基本构架Web应用的基本构架包括浏览器、网络和Web服务器。浏览器向服务器请求Web页,Web页可能包括由浏览器解释执行的客户端脚本,而且可以与浏览器、页内容和页中包含的其他控件(JavaApplet、ActiveX控件和插件等)进行交互。用户向Web页输入信息或通过超级链接导航到其它Web页,与系统进行交互,改变系统的“业务状态”。2.2WEB系统的基本原理是请求/响应客户端,浏览器接受用户输入的网页地址(URL)并进行分析,从而得到网页的文件名字和存放网页的计算机地址以及服务程序的端口号,首先根据计算机地址及端口号与服务器建立连接,然后把网页名称及浏览器本身的有关信息按照一定的格式组织起来,发给服务器,这就是‘请求’。比如用户输入从而可知:(1)计算机名称为kulin.ts根据这个名字能获知其计算机地址(2)端口号为80(http服务的默认端口号)(3)页面的文件名为index.html浏览器就与kulin上端口号为80的服务程序建立连接,并把类似下面的数据发过(作为服务‘请求’):GET/index.htmHTTP/1.1Accept:image/gif,image/x-xbitmap,application/vnd.ms-powerpoint,*/*Accept-Language:chUA-pixels:800*600UA-color:color16UA-OS:WindowsxpUA-CPU:P41.6User-Agent:Mozilla/2.0(compatible’MSIE3.01;WindowXPHost:kulin.tsConnection:Keep-Alive其中第一行说明了文件名称(index.html)、请求的类型(GET)及浏览器支持的协议版本(HTTP/1.0)服务器端接受到请求后,对其进行分析,解析出网页的文件名称及其他信息(比如请求的类型、处理要求等),根据网页的文件名称到磁盘上提取文件内容,把文件内容和一些必要的说明信息打包后发给浏览器,然后断开连接,这就是“响应”。(浏览器接到文件内容后就将其中的内容显示出来了)比如对于文件长度为2559B的index.html来说,可以发送如下数据作为“响应”:HTTP/1.1200OKServer:kulin.ts-HttpSvr/1.1Date:WED,20may200612:45:21Content-type:text/htmlContent-length:2559Last-Modified:Sun,22may200614:21:50接下来是index.htm的文件内容上述数据分2大部分,第1部分为“头”,其中,第1行是状态行,包括服务器执行的HTTP版本及本次响应的状态码。后4行分别说明了服务器名称、当前日期、数据类型、数据长度、最后修改的日期和时间。第2部分为数据“体”,是“请求”要求传送的数据,它跟在1个空行之后。当然,客户端和服务器之间还可能有一些中间环节,比如代理服务器、网关、“隧道”等,在此我们先不予考虑。2.3WEB服务器/浏览器的通信要完成Web服务,除了网络通信链路的建立和拆除,之外至少还要有二方面的功能:“分折请求”和“构造响应”。客户端与服务器交换数据之前,首先用TCP/IP建立连接,客户端向服务器请求数据,服务器则向客户端响应并提供数据.客户端和服务器以HTTP协议进行请求和响应.服务器和客户端只能为一次事务处理建立并维持连接,完成一次事务处理后便结束连接.每一个客户端向服务器发送请求均以方法(Method)开始,后跟对象的URL.客户端一般要在上述信息中补充所采用HTTP协议的版本号,其后跟一个回车换行(CRLF)字符对.依据请求情况,浏览器可能在CRLF后加上浏览器按特别的首部格式编码的信息.完成后,浏览器给请求加上一个CRLF.还可依据请求情况,把一个实体(MIME格式文档)加到整个请求之后.一个HTTP方法实际上是一条命令,客户端用它来说明其请求目的,常用的有GET,HEAD和POST.Web服务器收到请求并解析之后,以一个HTTP响应消息响应客户端的请求.这个响应消息通常以HTTP协议版本号开始,后面是三位状态码和一个原因短语(Reasonphrase),其后是一个CRLF,再后是请求的信息(它被服务器以一种特殊的首部格式编码),最后,服务器加上一个CRLF.其后还可以有一个可选实体.状态码是三位数,它描述了服务器理解和满足请求的情况,原因短语是状态代码的一个简短说明.HTTP协议版本号、状态代码、原因短语一起构成了状态行.上述分析不难看出,接收客户端请求、解析客户端请求、响应客户端请求、向客户端回送请求的结果是Web服务器所需完成的主要任务,Web服务器程序代码主要是为了完成这几项任务.2.3.1分析请求如前文所述,“请求”的第1行数据是最重要的,它的格式是:方法资源地址HTTP版本号回车换行“方法”主要有3种:GET:要求必须返回一定的内容。有时还必须根据“请求”的要求先对内容做一定的处理(比如解压缩或根据时间进行过滤)。HEAD:处理办法和GET完全相同,但要求只返回“头”,而不可返回任何实质内容(“体”)。POST:用来处理网页的附属内容,比如“注解”、数据回送等。作为简单的服务器,我们只考虑第一行,且只处理GET请求,版本号不予理睬。2.3.2构造响应如前文所述,响应的第1行是状态行,非常重要,格式如下:HTTP版本号状态码状态文字说明回车换行版本号可取HTTP/1.1;状态码是3位数字,根据情况按表2.1所示代码取值。表2.1状态码值代码特征含义举例1开头的2开头的3开头的4开头的5开头的保留未用成功需要进一步处理客户断错误服务器端错误比如200表示处理成功比如400表示“请求”有错,404表示找不到客户指定的文件作为简易的服务器,“响应”可以只返回状态行和文件内容,即送回如下的内容:HTTP/1.1200OK状态行一个空行文件内容文件内容2.4Winsock技术简介套接字是网络通信的基本构件,提供了不同主机间进程双向通信的端点,如同电话,只有当一方拨通另一方时,双方方能建立对话,而套接字正好比双方的电话。通过Sockets编程,程序可以跳过复杂的网络底层协议和结构,直接编制与平台无关的应用程序。随着Internet的广泛应用,Sockets已逐渐成为网络编程的通用接口。因为WindowsSockets主要是面向C/S体系结构的,即客户向服务器发出请求,服务器只有在接收到请求后才能提供相应服务。双方在建立对话前,服务进程和接受服务的进程(客户)必须首先建立起各自用于网间进程通信的半相关,即一个三元组(协议,本地地址,本地端口),但只有双方独立的半相关还不能建立起沟通。一个完整的网络通信进程必须通过由两个独立进程组成的一个完整的全相关唯一确定方能得已实现,而且,只有两个性质相同的半相关才能建立一个完整的全相关五元组——(协议,本地地址,本地端口,远地地址,远地端口),由此方能建立起一个网间进程通信的实例。第三章系统设计3.1界面设计正如包装那样,一个优秀的软件除了方便实用的功能外,其界面的优秀设计也是必不可少的,因为良好的界面形象一来能够体现公司的形象和实力;二来能够使用户操作更为方便,具有说明性的图表按钮也能够为用户带来使用的方便;三来能够体现其软件的良好特性和功能。目前软件界面的发展潮流为图形说明化和具体化,以前简单和粗糙的简单设计已经逐渐被淘汰,典型的如WindowsXP,其界面和Windows2000就有明显的差别,图形化的成分更多了,细致到每一个图表都有其特定的功能含义。本次设计的WEB服务器端的程序软件,虽然小,但也要尽量按照软件界面设计的发展趋势来完成,首先要方便简洁,另用户能很容易的上手操作,其次要尽量体现软件的良好特性和功能。3.1.1界面设计要求对于应用软件来说,一个基本现实就是:用户界面是面向用户的。用户需要的是开发者开发的应用软件满足其需求,并且易于使用。界面设计的重要性有这么几个原因:首先,用户界面越直观,就越易用,越易用就越便宜。因为界面越好,培训用户就越容易,降低了培训成本;界面越出色,用户就越少求助,降低了客户支持成本。其次,界面越出色,用户就喜欢使用,增强了开发者工作的满意度。3.1.2界面制作方法该WEB服务器是通过C++编程来实现的。首先新建一个MFCAppwizard(exe)工程,然后建立一个对话框。接着在对话框里面添加按钮,列表框以及静态文本框,改变各控件的名称,调整对话框及各控件的大小,使界面美观大方。3.2侦听模块设计侦听模块是HTTP服务器很重要的模块之一,它包括了服务器端的操作套接字,帮定端口,监听客户端请求几个部分,是服务器运行的关键部分。它的流程图如下:请求侦听模块流程图3.2.1服务器端操作Socket(套接字)(一)在初始化阶段调用WSAStartup()此函数在应用程序中初始化WindowsSocketsDLL,只有此函数调用成功后,应用程序才可以再调用其他WindowsSocketsDLL中的API函数。在程序中调用该函数的形式如下:WSAStartup((WORD)((18|1),(LPWSADATA)&WSAData),其中(18|1)表示我们用的是WinSocket1.1版本,WSAata用来存储系统传回的关于WinSocket的资料。(二)建立Socket初始化WinSock的动态连接库后,需要在服务器端建立一个监听的Socket,为此可以调用Socket()函数用来建立这个监听的Socket,并定义此Socket所使用的通信协议。此函数调用成功返回Socket对象,失败则返回INVALID_SOCKET(调用WSAGetLastError()可得知原因,所有WinSocket的函数都可以使用这个函数来获取失败的原因)。SOCKETPASCALFARsocket(intaf,inttype,intprotocol)参数:af:目前只提供PF_INET(AF_INET)