1、c语言综合实验报告Http Server和精简的浏览器C语言实验报告-Http Server和精简的浏览器姓名:徐丽 班级:计算机一班 学号:201200131113目录C语言实验报告 1一、实验目的 31.1实验目标 31.2整体框架 3二、实验要求 3三、实验内容 43.1工程介绍 43.2实现功能 43.3实验分析 53.3.1实验思想 53.3.2实验流程 53.3.3浏览器端实现 53.3.4服务器端实现 63.3.5实验结果演示 8一、实验目的1.1实验目标 做一个简易B/S系统Http Server和精简的浏览器1.2整体框架浏览器与web服务器通信协议:传输层使用TCP 应用层
2、使用HTTP二、实验要求 总共分为两个程序:浏览器端、服务器端A、浏览器端是一个精简的浏览器,可以是用户界面也可以是控制台模式,基本功能如下:1、 能接收用户输入的使用IP地址的URL,如http:/127.0.0.1:80/test.html2、 能显示接收到的响应,包括响应头和响应文件。可以显示在控制台上,也可以显示在用户界面上,也可以调用系统浏览器打开3、 通信使用HTTP协议,至少应支持GETB、服务器端是一个精简的Web服务器(HTTP服务器),使用控制台模式,基本功能如下:1、 能接收用户浏览器端GET请求2、 能够读取服务器中存储的html文件,并返回给请求客户端3、 使用一种并
3、发技术 (多进程/多线程/多路IO复用)来提高处理请求的并发度4、 支持简单的日志功能:记录(访问ip、访问时间、访问资源)等信息可选扩展选项(可选):1、 服务器端支持错误处理,如要访问的URL不存在时回复404错误等2、 服务器端为了提高处理速度,可以使用缓存机制,包括文件缓存内存数据结构的设计3、 服务器端除了支持GET,可以支持更多的HTTP命令,并编写相应的测试用例4、 服务器端增加日志分析模块,能够显示不同时间段的访问量、平均响应时间等统计数据和性能数据5、 HTTP可以支持压缩,比如gzip。服务器端可以增加压缩支持6、 高级特性:实现CGI模块或模仿nginx和apache的其
4、他特性三、实验内容3.1工程介绍实验总目录下有两个文件夹以及两个测试用的HTML文件,文件夹中一个是browser,一个是server。browser中存放browser.c、browser.h以及用于读写文件的filerw.c与filerw.h以及Makefile文件。此外还有用于保存浏览器访问记录的data文件。Server中存放server.c、server.h、filerw.c与filerw.h、Makefile文件以及用于实现服务器日志功能,记载访客记录的data文件。3.2实现功能基础功能全部实现,比如运用多线程实现并发、简单日志功能、够读取服务器中存储的html文件,并返回给请求
5、客户端,通信使用http协议等。此外扩展功能实现了错误处理以及用于提高访问速度缓存机制。3.3实验分析3.3.1实验思想使用socket来实现浏览器与服务器之间的通信。为了建立socket,程序可以调用socket函数,该函数返回一个类似于文件描述符的句柄。通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。面向连接的客户程序使用connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为:int connect(int sockfd, struct sockaddr *serv_addr,int addrlen)
6、。send()和recv()这两个函数用于面向连接的socket上进行数据传输。3.3.2实验流程首先打开server让它运作,然后打开browser,输入URL,请求就会生成报文(http协议)并发送给server。server接收到报文后,解析报文,并返回相应的应答报文以及请求资源。3.3.3浏览器端实现浏览器端首先输入UML串,然后解析串,得到IP地址、端口,及访问的文件请求。通过调用生成请求头的方法生成请求头,然后把相关的请求发给服务器,同时将访问记录写入文件,实现浏览器端记录历史数据的功能。然后把从服务器段发来的响应信息以及访问的资源内容显示出来。需要注意的一点是需要输入以下格式的资
7、源请求:http:/127.0.0.1::8080/test.html其中:http:/是固定不变的,本服务器现只支持http协议。127.0.0.1是要访问的web服务器所用的ip地址(本机ip地址),浏览器暂时不支持dns地址解析。8080端口是我在服务器中定义的默认端口。3.3.4服务器端实现由于TCP的服务器端socket基本流程为socket-bind-listen-accept-send/recv-closesocket,客户端基本流程为socket-connect-send/recv-closesocket。其中客户端connect函数应该是和服务器端的listen函数相互作用,
8、而不是accept函数。每当有一个客户端connect了,listen的队列中就加入一个连接,每当服务器端accept了,就从listen的队列中取出一个连接,转成一个专门用来传输数据的socket(accept函数的返回值),另外,当accept生成的那个专门的用来传输数据的socket没有被close(closesocket函数)掉之前,accept是不会释放那个socket的,也就是说在close之前,accept无法从listen的队列中取出一个新的连接转成传输专用的socket。所以我的服务器采用多线程处理来实现并发,就可以存在多个accept,每过来一个连接就建立一个线程,线程调用
9、与浏览器端通信的函数来处理此链接。并发处理更高效。因为实现了并发访问,因此关于写操作就需要用到互斥锁来控制同步。因此代码中最开始就初始化了互斥锁,在写操作前后加锁。 关于缓存机制的实现:原理就是,第一次访问时,从文件中读取资源后将资源存入缓存,当下次调用是直接从缓存中读取。关于错误处理的实现:最开始index初始化为0,在上一步缓存机制的for循环中,会将浏览器申请访问的资源与服务器中的资源进行比较,如果匹配会给index加1,如果index等于0,那么就可以判断出是404 error.3.3.5实验结果演示先运行server,然后运行browser,输入http:/127.0.0.1:8080/test.html 运行结果如下所示:Browser界面:先输出请求信息,然后输出服务器发来的相应信息以及请求的html文件的内容。这是服务器端显示接受到的浏览器发来的get 请求,最下面一句话显示是第一次请求该资源。缓存中还没有该资源。接下来是输入http:/127.0.0.1:8080/test2.html 显示的结果:服务器端:输入一个服务器端没有的资源显示的结果:输入l查看浏览记录:当再次访问test.html时,将从缓存中直接读数据,最后一行显示测试结果。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1