From e3736b2e3c983dce016bc20175931f7a5c2e12c8 Mon Sep 17 00:00:00 2001 From: xiemaomao Date: Wed, 30 Mar 2016 10:32:46 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=94=AF=E6=8C=81=E5=A4=9A=E4=B8=AAhead?= =?UTF-8?q?=20(-d=20"Head1:=20value"=20-d=20"Head2:=20value")?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webbench.c | 735 +++++++++++++++++++++++++++-------------------------- 1 file changed, 371 insertions(+), 364 deletions(-) diff --git a/webbench.c b/webbench.c index ff2e454..adfbc0c 100644 --- a/webbench.c +++ b/webbench.c @@ -13,8 +13,8 @@ * 1 - benchmark failed (server is not on-line) * 2 - bad param * 3 - internal error, fork failed - * - */ + * + */ #include "socket.c" #include #include @@ -82,408 +82,415 @@ static void build_request(const char *url); static void alarm_handler(int signal) { - timerexpired=1; -} + timerexpired=1; +} 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 Run benchmark for seconds. Default 30.\n" - " -x|--proxy Use proxy server for request.\n" - " -c|--clients Run 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" - " -d|--header
Custom HTTP header.\n" - " -p|--post Use POST request method.\n" - ); + "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 Run benchmark for seconds. Default 30.\n" + " -x|--proxy Use proxy server for request.\n" + " -c|--clients Run 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" + " -d|--header
Custom HTTP header.\n" + " -p|--post Use POST request method.\n" + ); }; int main(int argc, char *argv[]) { - int opt=0; - int options_index=0; - char *tmp=NULL; + int opt=0; + int options_index=0; + char *tmp=NULL; - if(argc==1) - { - usage(); - return 2; - } + if(argc==1) + { + usage(); + return 2; + } - while((opt=getopt_long(argc,argv,"912Vfrt:x:c:?hd:p:",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); - case 't': benchtime=atoi(optarg);break; - case 'x': - /* 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; - case 'd': header=optarg;break; - case 'p': - method=METHOD_POST; - body=optarg; - content_length=strlen(body); - break; - } - } - - if(optind==argc) { - fprintf(stderr,"webbench: Missing URL!\n"); - usage(); - return 2; - } + while((opt=getopt_long(argc,argv,"912Vfrt:x:c:?hd:p:",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); + case 't': benchtime=atoi(optarg);break; + case 'x': + /* 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; + case 'd': + if(header!=NULL) + { + strcat(header, "\r\n"); + strcat(header, optarg); + } else { + header = optarg; + } + break; + case 'p': + method=METHOD_POST; + body=optarg; + content_length=strlen(body); + break; + } + } - 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" - ); - 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; - case METHOD_POST: - printf("POST");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); + 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" + ); + 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; + case METHOD_POST: + printf("POST");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(); + 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(); } void build_request(const char *url) { - char tmp[10]; - int i; + char tmp[10]; + int i; + + bzero(host,MAXHOSTNAMELEN); + bzero(request,REQUEST_SIZE); - 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_POST && http10<1) http10=1; + if(method==METHOD_OPTIONS && http10<2) http10=2; + if(method==METHOD_TRACE && http10<2) http10=2; - if(force_reload && proxyhost!=NULL && http10<1) http10=1; - if(method==METHOD_HEAD && http10<1) http10=1; - if(method==METHOD_POST && http10<1) http10=1; - if(method==METHOD_OPTIONS && http10<2) http10=2; - if(method==METHOD_TRACE && http10<2) http10=2; + 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; + case METHOD_POST: strcpy(request,"POST");break; + } - 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; - case METHOD_POST: strcpy(request,"POST");break; - } - - strcat(request," "); + strcat(request," "); - if(NULL==strstr(url,"://")) - { - fprintf(stderr, "\n%s: is not a valid URL.\n",url); - exit(2); - } - if(strlen(url)>1500) - { - fprintf(stderr,"URL is too long.\n"); - exit(2); - } - if(proxyhost==NULL) - if (0!=strncasecmp("http://",url,7)) - { fprintf(stderr,"\nOnly HTTP protocol is directly supported, set --proxy for others.\n"); - exit(2); - } - /* protocol/host delimiter */ - i=strstr(url,"://")-url+3; - /* printf("%d\n",i); */ + if(NULL==strstr(url,"://")) + { + fprintf(stderr, "\n%s: is not a valid URL.\n",url); + exit(2); + } + if(strlen(url)>1500) + { + fprintf(stderr,"URL is too long.\n"); + exit(2); + } + if(proxyhost==NULL) + if (0!=strncasecmp("http://",url,7)) + { + fprintf(stderr,"\nOnly HTTP protocol is directly supported, set --proxy for others.\n"); + exit(2); + } + /* protocol/host delimiter */ + i=strstr(url,"://")-url+3; + /* printf("%d\n",i); */ - if(strchr(url+i,'/')==NULL) { - fprintf(stderr,"\nInvalid URL syntax - hostname don't ends with '/'.\n"); - exit(2); - } - if(proxyhost==NULL) - { - /* get port from hostname */ - if(index(url+i,':')!=NULL && - index(url+i,':')0) - strcat(request,"User-Agent: WebBench "PROGRAM_VERSION"\r\n"); - if(proxyhost==NULL && http10>0) - { - strcat(request,"Host: "); - strcat(request,host); - strcat(request,"\r\n"); - } - /* add header */ - if(header!=NULL) - { - strcat(request,header); - strcat(request,"\r\n"); - } - /* add content-length header */ - if(method==METHOD_POST) - { - snprintf(tmp,sizeof(tmp),"%d",content_length); - strcat(request, "Content-Length: "); - strcat(request, tmp); - strcat(request, "\r\n"); - } - if(force_reload && proxyhost!=NULL) - { - strcat(request,"Pragma: no-cache\r\n"); - } - if(http10>1) - strcat(request,"Connection: close\r\n"); - /* add empty line at end */ - if(http10>0) strcat(request,"\r\n"); - /* post body */ - if(method==METHOD_POST) - { - strcat(request,body); - } - // printf("Req=%s\n",request); + if(strchr(url+i,'/')==NULL) { + fprintf(stderr,"\nInvalid URL syntax - hostname don't ends with '/'.\n"); + exit(2); + } + if(proxyhost==NULL) + { + /* get port from hostname */ + if(index(url+i,':')!=NULL && index(url+i,':')0) + strcat(request,"User-Agent: WebBench "PROGRAM_VERSION"\r\n"); + if(proxyhost==NULL && http10>0) + { + strcat(request,"Host: "); + strcat(request,host); + strcat(request,"\r\n"); + } + /* add header */ + if(header!=NULL) + { + strcat(request,header); + strcat(request,"\r\n"); + } + /* add content-length header */ + if(method==METHOD_POST) + { + snprintf(tmp,sizeof(tmp),"%d",content_length); + strcat(request, "Content-Length: "); + strcat(request, tmp); + strcat(request, "\r\n"); + } + if(force_reload && proxyhost!=NULL) + { + strcat(request,"Pragma: no-cache\r\n"); + } + if(http10>1) + strcat(request,"Connection: close\r\n"); + /* add empty line at end */ + if(http10>0) strcat(request,"\r\n"); + /* post body */ + if(method==METHOD_POST) + { + strcat(request,body); + } + // printf("Req=%s\n",request); } /* vraci system rc error kod */ static int bench(void) { - int i,j,k; - pid_t pid=0; - FILE *f; + int i,j,k; + pid_t pid=0; + FILE *f; - /* check avaibility of target server */ - i=Socket(proxyhost==NULL?host:proxyhost,proxyport); - if(i<0) { - fprintf(stderr,"\nConnect to server failed. Aborting benchmark.\n"); - return 1; - } - close(i); - /* create pipe */ - if(pipe(mypipe)) - { - perror("pipe failed."); - return 3; - } + /* check avaibility of target server */ + i=Socket(proxyhost==NULL?host:proxyhost,proxyport); + if(i<0) { + fprintf(stderr,"\nConnect to server failed. Aborting benchmark.\n"); + return 1; + } + close(i); + /* create pipe */ + if(pipe(mypipe)) + { + perror("pipe failed."); + return 3; + } - /* not needed, since we have alarm() in childrens */ - /* wait 4 next system clock tick */ - /* - cas=time(NULL); - while(time(NULL)==cas) - sched_yield(); - */ + /* not needed, since we have alarm() in childrens */ + /* wait 4 next system clock tick */ + /* + cas=time(NULL); + while(time(NULL)==cas) + sched_yield(); + */ - /* fork childs */ - for(i=0;i0) - { - /* fprintf(stderr,"Correcting failed by signal\n"); */ - failed--; - } - return; - } - s=Socket(host,port); - if(s<0) { failed++;continue;} - if(rlen!=write(s,req,rlen)) {failed++;close(s);continue;} - if(http10==0) - if(shutdown(s,1)) { failed++;close(s);continue;} - if(force==0) + rlen=strlen(req); + nexttry:while(1) { + if(timerexpired) + { + if(failed>0) + { + /* fprintf(stderr,"Correcting failed by signal\n"); */ + failed--; + } + return; + } + s=Socket(host,port); + if(s<0) { failed++;continue;} + if(rlen!=write(s,req,rlen)) {failed++;close(s);continue;} + if(http10==0) + if(shutdown(s,1)) { failed++;close(s);continue;} + if(force==0) + { /* read all available data from socket */ - while(1) - { - if(timerexpired) break; - i=read(s,buf,1500); - /* fprintf(stderr,"%d\n",i); */ - if(i<0) - { - failed++; - close(s); - goto nexttry; - } - else - if(i==0) break; - else - bytes+=i; - } + while(1) + { + if(timerexpired) break; + i=read(s,buf,1500); + /* fprintf(stderr,"%d\n",i); */ + if(i<0) + { + failed++; + close(s); + goto nexttry; + } + else + if(i==0) break; + else + bytes+=i; + } + } + if(close(s)) {failed++;continue;} + speed++; } - if(close(s)) {failed++;continue;} - speed++; - } }