webbench总共就是三个文件,makefile,socket.c,webbench.c
makefile
完成编译,sudo make install
安装到 /usr/local/bin
目录下面。
其实 make install命令就是把可执行文件拷贝到/bin目录下面。
INSTALL(1) User Commands INSTALL(1)
NAME
install - copy files and set attributes
SYNOPSIS
install [OPTION]... [-T] SOURCE DEST
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
install [OPTION]... -d DIRECTORY...
DESCRIPTION
This install program copies files (often just compiled) into destina‐
tion locations you choose. If you want to download and install a
ready-to-use package on a GNU/Linux system, you should instead be using
a package manager like yum(1) or apt-get(1).
phony:
PHONY定义伪目标的命令一定会被执行,下面尝试分析这种优点的妙处。
1、如果我们指定的目标不是创建目标文件,而是使用makefile执行一些特定的命令,例如:
clean:rm *.o temp
我们希望,只要输入"make clean"后,"rm *.o temp"命令就会执行。但是,当当前目录中存在一个和指定目标重名的文件时,例如clean文件,结果就不是我们想要的了。输入"make clean"后,“rm *.o temp” 命令一定不会被执行。
解决的办法是,将目标clean定义成伪目标就成了。无论当前目录下是否存在"clean"这个文件,输入"make clean"后,"rm *.o temp"命令都会被执行。
注意:这种做法的带来的好处还不止此,它同时提高了make的执行效率,因为将clean定义成伪目标后,make的执行程序不会试图寻找clean的隐含规则。
Socket.c
Sokcet.c封装了对于目标网站的TCP套接字的构造,其中Socket函数用于获取连接目标网站TCP套接字.使用了gethostbyname来进行dns查询。使得webbench支持域名测试与直接ip测试。
webbench.c
小函数:
alarm_handler :作为超时信号的回调函数,设置 timerexpired
全局变量为1;
usage:用于向控制台打印帮助信息。
核心就是三个函数benchcore
,build request
,bench
build_request
根据传入的url以及一些全局设置,把请求报文的字符串拼接出来。
//把请求报文给拼出来
void build_request(const char *url)
{
char tmp[10];
int i;
bzero(host, MAXHOSTNAMELEN);
bzero(request, REQUEST_SIZE);
if (force_reload && proxyhost != NULL && http10 < 1)
http10 = 1;
if (method == METHOD_HEAD && http10 < 1)
http10 = 1;
if (method == METHOD_OPTIONS && http10 < 2)
http10 = 2;
if (method == METHOD_TRACE && http10 < 2)
http10 = 2;
//根据method,写下请求方法
switch (method)
{
default:
case METHOD_GET:
strcpy(request, "GET");
break;
case METHOD_HEAD:
strcpy(request, "HEAD");
break;
case METHOD_OPTIONS:
strcpy(request, "OPTIONS");
break;
case METHOD_TRACE:
strcpy(request, "TRACE");
break;
}
//写空格
strcat(request, " ");
//判断输入的url,非http的抛弃,过长的抛弃
if (NULL == strstr(url, "://"))
{
fprintf