代码摘录于webbench 的源代码
static void usage(void) {
fprintf(stderr, "webbench [option]... URL\n"
" -f|--force Don't wait for reply from server.\n"
" -r|--reload Send reload request - Pragma: no-cache.\n"
" -t|--time <sec> Run benchmark for <sec> seconds. Default "
"30.\n"
" -p|--proxy <server:port> Use proxy server for request.\n"
" -c|--clients <n> Run <n> HTTP clients at once. Default one.\n"
" -9|--http09 Use HTTP/0.9 style requests.\n"
" -1|--http10 Use HTTP/1.0 protocol.\n"
" -2|--http11 Use HTTP/1.1 protocol.\n"
" --get Use GET request method.\n"
" --head Use HEAD request method.\n"
" --options Use OPTIONS request method.\n"
" --trace Use TRACE request method.\n"
" -?|-h|--help This information.\n"
" -V|--version Display program version.\n");
};
static const struct option long_options[] = {
// long option entry: name - 是否有参数 -
// 如果flag即第三个参数 为 NULL 则 getopt_long 返回第四个参数val
// 如果flag 不是NULL.则getopt_long 返回0并且将flag 设置为val
{"force", no_argument, &force, 1},// 长参数名为force 没有参数 getopt_long 返回0 且将force 设置为1
{"reload", no_argument, &force_reload, 1},// 长参数名为reload 没有参数 getopt_long 返回0 且将force_reload 设置为1
{"time", required_argument, NULL, 't'},// 长参数名为time 需要参数 getopt_long 返回t
{"help", no_argument, NULL, '?'},
{"http09", no_argument, NULL, '9'},
{"http10", no_argument, NULL, '1'},
{"http11", no_argument, NULL, '2'},
{"get", no_argument, &method, METHOD_GET}, // will set method to be METHOD_GET because the third argument
// is NULL
{"head", no_argument, &method, METHOD_HEAD},
{"options", no_argument, &method, METHOD_OPTIONS},
{"trace", no_argument, &method, METHOD_TRACE},
{"version", no_argument, NULL, 'V'},
{"proxy", required_argument, NULL, 'p'},
{"clients", required_argument, NULL, 'c'},
{NULL, 0, NULL, 0}};
int main(int argc, char* argv[]) {
int opt = 0;
int options_index = 0;
char* tmp = NULL;
if (argc == 1) {
usage();
return 2;
}
// optarg : option argument
// optint : option index
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;
// specify http version
case '9': http10 = 0; break;
case '1': http10 = 1; break;
case '2': http10 = 2; break;
case 'V': printf(PROGRAM_VERSION "\n"); exit(0);
case 't': benchtime = atoi(optarg); break;
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;
// usage
case ':':
case 'h':
case '?':
usage();
return 2;
break;
case 'c': clients = atoi(optarg); break;
}
}
if (optind == argc) {
fprintf(stderr, "webbench: Missing URL!\n");
usage();
return 2;
}
if (clients == 0)
clients = 1;
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");
// 2. build http request
build_request(argv[optind]);
/* print bench info */
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");
return bench();
}