C 语言综合试验报告
C 语言综合实验报告
学号:20120013
班级:计算机学院 12 级 2 班
姓名:
目录:
C 语言综合实验报告 .........................................................................................................................1
实验任务 ............................................................................................................................ 2
一.
1.实验目的 ................................................................................................................................. 2
2.实验要求 ................................................................................................................................. 2
3.具体要求和帮助 ..................................................................................................................... 2
实验过程 ............................................................................................................................ 5
1.试验环境 ................................................................................................................................. 5
2.实验说明 ................................................................................................................................. 5
3.实验成果 ................................................................................................................................. 5
4.程序运行截图 ......................................................................................................................... 5
源码和其他文件说明........................................................................................................8
1. 源码 .................................................................................................................................... 8
2. 其他文件 .......................................................................................................................... 20
实验总结 .......................................................................................................................... 21
参考资料 .......................................................................................................................... 22
四.
五.
二.
三.
1 / 22
C 语言综合试验报告
一.实验任务
1.实验目的
做一个简易 B/S 系统——Http Server 和精简的浏览器。
2.实验要求
总共分为两个程序:浏览器端、服务器端
A、浏览器端是一个精简的浏览器,可以是用户界面也可以是控制台模式,基本功能如下:
(1)能接收用户输入的使用 IP 地址的 URL,如 http://127.0.0.1:80/test.html
(2)能显示接收到的响应,包括响应头和响应文件。可以显示在控制台上,也可以显示在
用户界面上,也可以调用系统浏览器打开
(3)通信使用 HTTP 协议,至少应支持 GET
B、服务器端是一个精简的 Web 服务器(HTTP 服务器),使用控制台模式,基本功能如下:
(1)能接收用户浏览器端 GET 请求
(2)能够读取服务器中存储的 html 文件,并返回给请求客户端
(3)使用一种并发技术 (多进程/多线程/多路 IO 复用)来提高处理请求的并发度
(4)支持简单的日志功能:记录(访问 ip、访问时间、访问资源)等信息
可选扩展选项(可选):
1、 服务器端支持错误处理,如要访问的 URL 不存在时回复 404 错误等
2、 服务器端为了提高处理速度,可以使用缓存机制,包括文件缓存内存数据结构的设计
3、 服务器端除了支持 GET,可以支持更多的 HTTP 命令,并编写相应的测试用例
4、 服务器端增加日志分析模块,能够显示不同时间段的访问量、平均响应时间等统计数据
和性能数据
5、 HTTP 可以支持压缩,比如 gzip。服务器端可以增加压缩支持
6、 高级特性:实现 CGI 模块或模仿 nginx 和 apache 的其他特性
3.具体要求和帮助
(1)浏览器访问完整版流程
2 / 22
C 语言综合试验报告
其中,
a、DNS 是可选,可以直接用 IP 地址代替网址;
b、浏览器显示界面可选,非重点,可以在控制台显示 html 文件内容。其他步骤不可简
化。
(2)HTTP 协议基础知识
参考网址:http://www.360doc.com/content/13/0217/11/9318309_266094744.shtml
简化处理,但我们至少要支持 GET 方式的请求。
请求报文构成:
3 / 22
C 语言综合试验报告
like Gecko)
我们访问 www.baidu.com 的请求如下(通过 Wireshark 抓包):
GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML,
Chrome/21.0.1180.92 Safari/537.1 LBBROWSER
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
xxxxxxxxxxxxxxx: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: BAIDUID=E21378CBAB746D5B00E45348BBD091FB:FG=1; ......
响应报文如下:
HTTP/1.1 200 OK
Date: Tue, 02 Apr 2013 01:29:24 GMT
Server: BWS/1.0
Content-Length: 7083
Content-Type: text/html;charset=utf-8
Cache-Control: private
Content-Encoding: gzip
Vary: Accept-Encoding
Expires: Tue, 02 Apr 2013 01:29:24 GMT
Set-Cookie: H_PS_PSSID=2121_1431_1944_1788; path=/; domain=.baidu.com
Connection: Keep-Alive
[html 网页数据]
百度支持 gzip,我们可以不压缩数据。使用标准浏览器来验证我们的 web 服务器是否正确。
可以通过访问广域网上的网站如 ping www.baidu.com 获得的 ip 来验证我们自制浏览器的正
确性。
(3)Socket 编程基本知识
Linux socket 参考网站:http://blog.csdn.net/fengyv/article/details/659980
socket 在 linux gcc、windows gcc、VS 中的使用方法略有不同,资料自己查找。推荐使用 Linux
gcc。
4 / 22
C 语言综合试验报告
(4)服务器端的并发处理
服务器为了应对同时多个请求到达的情况,必须支持并发,可选基本模式有三种:多进程、
多线程、多路复用 IO 接口。在 Linux 下的代表机制分别为:fork、pthread、epoll/select/poll。
著名的 Apache HTTP Server 支持多进程和多线程,而刚刚崛起的 Nginx 在 Linux 下默认使用
的是 epoll。下面是参考网站:
fork http://blog.csdn.net/lingdxuyan/article/details/4993883
pthread http://blog.csdn.net/handyhuang/article/details/8301058
epoll http://blog.csdn.net/ljx0305/article/details/4065058
select http://www.douban.com/note/265840990/?type=like
使用 select 实现的 echo (linux 版)http://blog.csdn.net/god2469/article/details/8761346
使用 select 的 TCP 示例(linux+windows):http://www.zeali.net/entry/13
二.实验过程
1.试验环境
Ubuntu14.10(VMware 中)+gcc
2.实验说明
仔细阅读实验要求后,考虑到实际情况是单人开发而且时间有限所以决定:
(1) 浏览器端是一个精简的浏览器,不做图形界面而使用控制台模式,符合老师实验的
基本要求,代码也会比较简洁。
(2) 浏览器端并发处理的技术上我选择的是多线程方式,因为它比用多进程方式占用的
资源要少很多而且我比较熟悉。
(3) 出于简易考虑,浏览器端和服务器端源码都只有一个.c,直接在终端 gcc 编译。
3.实验成果
浏览器端和服务器端编码编译通过运行成功。实验基本要求全部实现,扩展功能部分实
现,包括:
(1)服务器端支持错误处理,如要访问的 URL 不存在时回复 404 错误等
(2)服务器端为了提高处理速度,可以使用缓存机制,包括文件缓存内存数据结构的设计
4.程序运行截图
(1)浏览器端
查看记录(输入 r):
5 / 22
C 语言综合试验报告
访问 http://127.0.0.1:8080/test0.html(输入访问内容):
调用 firefox 打开(自动):
6 / 22
C 语言综合试验报告
未找到文件:
访问 http://www.baidu.com(输入百度域名)
退出(输入 e)
(4) 服务器端(无手动操作)
7 / 22
C 语言综合试验报告
三.源码和其他文件说明
文件说明:总文件夹 cfinalexp 下包含 browser 和 server 两个文件夹。browser 文件夹包
含 browser.c(浏览器端源码),browserdoc.data(浏览器访问记录),recv.html(保存接
收到的.html 内容);server 文件夹包含 server.c(服务器端源码),serverdoc.data(服务
器日志),test0.html,test1.html(html 资源),notfound.html(错误返回 html)。
1. 源码
源码包括 browser.c 和 server.c
(1) browser.c
8 / 22