宏定义
#define METHOD_GET 0
#define METHOD_HEAD 1
#define METHOD_OPTIONS 2
#define METHOD_TRACE 3
#define PROGRAM_VERSION "1.5"
#defind REQUEST_SIZE 2048
全局变量
volatile int timerexpired=0;
int speed=0;
int failed=0;
int bytes=0;
/* globals */
int http10=1; /* 0 - http/0.9, 1 - http/1.0, 2 - http/1.1 */
int method=METHOD_GET;
int clients=1;
int force=0;
int force_reload=0;
int proxyport=80;
char *proxyhost=NULL;
int benchtime=30;
/* internal */
int mypipe[2];
char host[MAXHOSTNAMELEN];
char request[REQUEST_SIZE];
分析:
由main函数入手
main函数中首先对命令行进行解析,如果命令行数量为1,则说明没有输入参数,此时要输出帮助信息。
对命令行参数进行解析,如果含有f,则让force=1,如果含有r,则让force_reload为1,其他依次类推。当参数为p,则代表使用了代理服务器,那么就查找字符串中的最后一个':'的位置并将从该字符开始的字符串返回给tmp,让proxyhost指向代理服务器地址。
如果tmp变量的值等于optarg,则说明只有端口号没有主机名,报错。注意这里的等于并非将字符串复制了,而仅是复制了地址。
如果参数中含有'h'或'?',则返回帮助信息,参数是'c',则获取clients的数量
使用build_request方法对url建立连接
接下来的部分是输出一些设置信息。
build_request
建立连接
bench
创建子进程并使用子进程发起请求,子进程请求的结果写入管道由父进程读取
bench_core
创建新连接、注册信号函数及通信等