webbench源码分析之main函数

来源:互联网 发布:网址推广联盟 乐乎 编辑:程序博客网 时间:2024/05/17 02:52
int main(int argc, char *argv[])  
{  
int opt = 0;  // getopt_long的返回字符
int options_index = 0;  // getopt_long的第五个参数,一般为0
char *tmp = NULL;


if(argc == 1)//使用方法不合适
{  
 usage();
 return 2;

// 使用getopt_long函数读取命令行参数,来设置所涉及到的全局变量的值
// getopt_long函数支持长选项的命令行解析,其声明如下:
// int getopt_long(int argc, char *const argv[], const char *optstring, const struct option *long_options, int *longindex)
// 检查输入参数,并设置对应选项proxyhost
while((opt = getopt_long(argc,argv,"912Vfrt:p:c:?h",long_options,&options_index)) != EOF )
{  
switch(opt)
{
case  0 : break;
case 'f': force = 1; break;
case 'r': force_reload = 1; break;
case '9': http10 = 0; break;
case '1': http10 = 1; break;
case '2': http10 = 2; break;
case 'V': printf(PROGRAM_VERSION"\n");exit(0);//输入版本号
// -t 后跟压力测试时间,optarg返回,使用atoi转换成整数
case 't': benchtime = atoi(optarg); break;  //optarg表示命令后的参数,例如-c 100,optarg为100。  
//atoi表示把字符串转换成长整型。
case 'p': 
/* proxy server parsing server:port */
tmp = strrchr(optarg,':');
proxyhost = optarg;//设定地址
if(tmp == NULL)
{
break;
}
if(tmp == optarg)
{
fprintf(stderr, "Error in option --proxy %s: Missing hostname.\n", optarg);
return 2;
}
if(tmp == optarg + strlen(optarg) - 1)
{
fprintf(stderr, "Error in option --proxy %s Port number is missing.\n", optarg);
return 2;
}
// 获取代理地址
*tmp = '\0';
proxyport = atoi(tmp+1);break;//重设端口号
case ':':
case 'h':
case '?': usage();return 2;break;
case 'c': clients = atoi(optarg);break;//并发数   -c N
}
}
//optind为对应参数的下标位置
// 扫描参数选项时,optind标识下一个选项的索引;扫描结束后,标识第一个非选项参数索引;如
// 果optind = argc,说明非选项参数即服务器URL缺失。此变量是系统定义的。
// optind返回第一个不包含选项的命令名参数,此处为URL值
if(optind == argc) {
fprintf(stderr, "webbench: Missing URL!\n");
usage();
return 2;
}  
// 此处多做一次判断,可预防BUG,因为上文并发数目用户可能写0
if(clients == 0) clients = 1;
// 压力测试时间默认为30s,如果用户写成0,则默认为60s
if(benchtime == 0) benchtime = 60;
/* Copyright */
fprintf(stderr, "Webbench - Simple Web Benchmark "PROGRAM_VERSION"\n"
"Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.\n"
);  
//使用中,最后为URL,所以optind应该是URL的位置 
// 调用build_request函数构建完整的HTTP请求头,HTTP request存储在全局变量char request[REQUEST_SIZE] 
build_request(argv[optind]);
/* print bench info */
// 在屏幕上打印测试的信息,如HTTP协议,请求方式,并发个数,请求时间等
printf("\nBenchmarking: ");
switch(method)
{
case METHOD_GET:
default:
printf("GET");break;
case METHOD_OPTIONS:
printf("OPTIONS");break;
case METHOD_HEAD:
  printf("HEAD");break;
case METHOD_TRACE:
  printf("TRACE");break;
}
printf(" %s",argv[optind]);
switch(http10)
{
case 0: printf(" (using HTTP/0.9)");break;
case 2: printf(" (using HTTP/1.1)");break;
}
printf("\n");
if(clients == 1) printf("1 client");
else
printf("%d clients",clients);
printf(", running %d sec", benchtime);
if(force)
printf(", early socket close");
if(proxyhost != NULL)
printf(", via proxy server %s:%d",proxyhost,proxyport);
if(force_reload)
printf(", forcing reload");
printf(".\n");
// 调用bench函数,开始压力测试,bench()为压力测试核心代码
return bench();

}

更多精彩,请点击:http://blog.csdn.net/weixin_37977062?viewmode=contents

原创粉丝点击