早有听闻WebBench和TinyHttpd是工程师不得不了解的十大优秀C语言开源项目
出乎我意料的是,两个项目的代目都十分精简约在400行左右,而且稳定性极高,将近十年未更新
任务:
1.编译运行WebBench并了解注释WebBench源代码
2.编译运行TinyHttpd并了解注释TinyHttpd源代码
3.用编译的WebBench测试编译的TinyHttpd
那就先说WebBench咯~
WebBench
源码在此
http://home.tiscali.cz/~cz210552/webbench.html
编译运行
步骤如下
1.在网站上下载源代码wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz
2.解压tar zxvf webbench-1.5.tar.gz
//tinyhttpd同理
3.
|
|
4.make文件
|
|
(1)
出现找不到ctags或gcc
yum install ctags
5.
|
|
(2)error 1
mkdir -m 644 -p /usr/local/man/man1
WebBench使用
|
|
webbench -c 并发数 -t 运行测试时间 URL
x可以直接输3w或者IP地址
通过ping获取IP地址
开始测试baidu服务器的抗压性能
注意IP地址跟域名是一样的意思
咱们先试一下100个用户30s测试
可以看出全都成功了
1000个用户30s测试
=v=结果如图
100个用户60s测试
10%左右的成功率。。
前方高能WebBench400多行的
!!!源码分析!!!!
//socket.c
|
|
------------------------
//webbench.c
|
|
参考
http://www.cnblogs.com/xuning/p/3888699.html
接下来说一说TinyHttpd~
TinyHttpd
https://sourceforge.net/projects/tinyhttpd/files/latest/download
源码在此 tinyhttpd-0.1.0.tar.gz
编译运行
步骤如下
1.在网站上下载源代码
wget http://jaist.dl.sourceforge.net/project/tinyhttpd/tinyhttpd%20source/tinyhttpd%200.1.0/tinyhttpd-0.1.0.tar.gz
2.解压
|
|
3.
4.make文件
|
|
高能出现错误!
原因分析!
TinyHttpd本来是在solaris上实现的,在socket和pthread的实现上和一般的Linux不一样。httpd.c开始的英文注释做出了对程序修改的详细指引
故(1)修改httpd.c根据开头注释
|
|
(2)在makefile文件中改为
|
|
make完结果
TinyHttpd使用
1.运行应用
|
|
得到端口号为52870
2.在浏览器firefox中输入地址
|
|
TinyHttpd源码分析
1.函数功能如下
accept_request: 处理从套接字上监听到的一个 HTTP 请求,在这里可以很大一部分地体现服务器处理请求流程。
bad_request: 返回给客户端这是个错误请求,HTTP 状态吗 400 BAD REQUEST.
cat: 读取服务器上某个文件写到 socket 套接字。
cannot_execute: 主要处理发生在执行 cgi 程序时出现的错误。
error_die: 把错误信息写到 perror 并退出。
execute_cgi: 运行 cgi 程序的处理,也是个主要函数。
get_line: 读取套接字的一行,把回车换行等情况都统一为换行符结束。
headers: 把 HTTP 响应的头部写到套接字。
not_found: 主要处理找不到请求的文件时的情况。
sever_file: 调用 cat 把服务器文件返回给浏览器。
startup: 初始化 httpd 服务,包括建立套接字,绑定端口,进行监听等。
unimplemented: 返回给浏览器表明收到的 HTTP 请求所用的 method 不被支持。
2.注释详细如上
[综合]WebBench测试TinyHttpd
基本如上
1.用TinyHttpd小型web服务器
2.用WebBench对地址进行测试
出现错误
全部failed且TinyHttpd自动断开
开始以为并发数的问题,减小后并未改善
网上查阅资料后
解决方法
(1)原因
因为WebBench在一次访问完之后就断掉了,但是TinyHttpd要分次把一个网页的内容发送给WebBench,所以第一次发的时候是成功的,第二次就失败了。而且TinyHttpd在send的时候没有异常判断和处理,所以程序卡死
(2)解决
httpd.c的unimplemented中将后面的14行代码发送注释掉
|
|
3.make重新编译
4.运行
|
|
运行结果全部成功
[总结]
小小的预告!
下一篇会详细解释最后最综合的网络实验,从一开始搜bing到有时候科学上网google,再到后面看cnblog、csdn找到有用的答案或错误分享解决方案,到逐渐从github找到大神。
结论:最make sense的还是开发者的README.md,自己编的程序自己最清楚嘛,次之是github的大神或者stackflow。对英文有一定要求。至于bing、google搜出来的答案当然也会有用的但是鱼龙混杂,能找到有帮助但却浪费了一定时间。