From e2c39b398fb0b30fb03d30f5827b09d16483be29 Mon Sep 17 00:00:00 2001 From: cuijunjie18 <2871843852@qq.com> Date: Tue, 23 Dec 2025 11:39:01 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=20=E4=BF=AE=E5=A4=8D=E6=94=AF=E6=8C=81Ubu?= =?UTF-8?q?ntu22.04=E7=BC=96=E8=AF=91=20[style]=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=A3=8E=E6=A0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .clang-format | 108 ++++++ .gitignore | 2 + webbench.c | 895 +++++++++++++++++++++++++------------------------- 3 files changed, 566 insertions(+), 439 deletions(-) create mode 100644 .clang-format create mode 100644 .gitignore diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..d368b34 --- /dev/null +++ b/.clang-format @@ -0,0 +1,108 @@ +--- +Language: Cpp +# BasedOnStyle: LLVM +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: Right +AlignOperands: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: false +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeInheritanceComma: false +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 80 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + - Regex: '.*' + Priority: 1 +IncludeIsMainRegex: '(Test)?$' +IndentCaseLabels: false +IndentWidth: 2 +IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Right +ReflowComments: true +SortIncludes: true +SortUsingDeclarations: true +SpaceAfterCStyleCast: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp11 +TabWidth: 8 +UseTab: Never +... + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7838696 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +webbench +*.o \ No newline at end of file diff --git a/webbench.c b/webbench.c index 318a8fc..bafdfcf 100644 --- a/webbench.c +++ b/webbench.c @@ -1,51 +1,51 @@ /* -* (C) Radim Kolar 1997-2004 -* This is free software, see GNU Public License version 2 for -* details. -* -* Simple forking WWW Server benchmark: -* -* Usage: -* webbench --help -* -* Return codes: -* 0 - sucess -* 1 - benchmark failed (server is not on-line) -* 2 - bad param -* 3 - internal error, fork failed -* -*/ + * (C) Radim Kolar 1997-2004 + * This is free software, see GNU Public License version 2 for + * details. + * + * Simple forking WWW Server benchmark: + * + * Usage: + * webbench --help + * + * Return codes: + * 0 - sucess + * 1 - benchmark failed (server is not on-line) + * 2 - bad param + * 3 - internal error, fork failed + * + */ #include "socket.c" -#include -#include -#include #include +#include +#include #include +#include #include -#include +#include /* values */ -volatile int timerexpired=0; -int speed=0; -int failed=0; -int bytes=0; +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 http10 = 1; /* 0 - http/0.9, 1 - http/1.0, 2 - http/1.1 */ /* Allow: GET, HEAD, OPTIONS, TRACE */ #define METHOD_GET 0 #define METHOD_HEAD 1 #define METHOD_OPTIONS 2 #define METHOD_TRACE 3 #define PROGRAM_VERSION "1.5" -int method=METHOD_GET; -int clients=1; -int force=0; -int force_reload=0; -int proxyport=80; -char *proxyhost=NULL; -int benchtime=30; +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]; @@ -53,442 +53,459 @@ char host[MAXHOSTNAMELEN]; #define REQUEST_SIZE 2048 char request[REQUEST_SIZE]; -static const struct option long_options[]= -{ - {"force",no_argument,&force,1}, - {"reload",no_argument,&force_reload,1}, - {"time",required_argument,NULL,'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}, - {"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} -}; +static const struct option long_options[] = { + {"force", no_argument, &force, 1}, + {"reload", no_argument, &force_reload, 1}, + {"time", required_argument, NULL, '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}, + {"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}}; /* prototypes */ -static void benchcore(const char* host,const int port, const char *request); +static void benchcore(const char *host, const int port, const char *request); static int bench(void); static void build_request(const char *url); -static void alarm_handler(int signal) -{ - 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" - " -p|--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" - ); +static void alarm_handler(int signal) { 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" + " -p|--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"); } -int main(int argc, char *argv[]) -{ - int opt=0; - int options_index=0; - char *tmp=NULL; - - if(argc==1) - { - usage(); +int main(int argc, char *argv[]) { + int opt = 0; + int options_index = 0; + char *tmp = NULL; + + if (argc == 1) { + usage(); + return 2; + } + + 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); + 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; - } - - 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); - 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; - case ':': - case 'h': - case '?': usage();return 2;break; - case 'c': clients=atoi(optarg);break; - } + } + 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; } + } + + if (optind == argc) { + fprintf(stderr, "webbench: Missing URL!\n"); + usage(); + return 2; + } + + if (clients == 0) + clients = 1; + if (benchtime == 0) + benchtime = 30; + + /* 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 request info ,do it in function build_request + /*printf("Benchmarking: "); + + 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"); + */ + + printf("Runing info: "); + + 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(); +} - if(optind==argc) { - fprintf(stderr,"webbench: Missing URL!\n"); - usage(); - return 2; +void build_request(const char *url) { + char tmp[10]; + int i; + + // bzero(host,MAXHOSTNAMELEN); + // bzero(request,REQUEST_SIZE); + memset(host, 0, MAXHOSTNAMELEN); + memset(request, 0, 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; + + 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, " "); + + 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 (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; + + 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, ':') < index(url + i, '/')) { + strncpy(host, url + i, strchr(url + i, ':') - url - i); + // bzero(tmp,10); + memset(tmp, 0, 10); + strncpy(tmp, index(url + i, ':') + 1, + strchr(url + i, '/') - index(url + i, ':') - 1); + /* printf("tmp=%s\n",tmp); */ + proxyport = atoi(tmp); + if (proxyport == 0) + proxyport = 80; + } else { + strncpy(host, url + i, strcspn(url + i, "/")); + } + // printf("Host=%s\n",host); + strcat(request + strlen(request), url + i + strcspn(url + i, "/")); + } else { + // printf("ProxyHost=%s\nProxyPort=%d\n",proxyhost,proxyport); + strcat(request, url); + } + + if (http10 == 1) + strcat(request, " HTTP/1.0"); + else if (http10 == 2) + strcat(request, " HTTP/1.1"); + + strcat(request, "\r\n"); + + if (http10 > 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"); + } + + 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"); + + printf("\nRequest:\n%s\n", request); +} + +/* vraci system rc error kod */ +static int bench(void) { + 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; + } + + /* 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; i < clients; i++) { + pid = fork(); + if (pid <= (pid_t)0) { + /* child process or error*/ + sleep(1); /* make childs faster */ + break; } + } + + if (pid < (pid_t)0) { + fprintf(stderr, "problems forking worker no. %d\n", i); + perror("fork failed."); + return 3; + } + + if (pid == (pid_t)0) { + /* I am a child */ + if (proxyhost == NULL) + benchcore(host, proxyport, request); + else + benchcore(proxyhost, proxyport, request); - if(clients==0) clients=1; - if(benchtime==0) benchtime=30; - - /* 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 request info ,do it in function build_request - /*printf("Benchmarking: "); - - 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; + /* write results to pipe */ + f = fdopen(mypipe[1], "w"); + if (f == NULL) { + perror("open pipe for writing failed."); + return 3; } - - printf(" %s",argv[optind]); - - switch(http10) - { - case 0: printf(" (using HTTP/0.9)");break; - case 2: printf(" (using HTTP/1.1)");break; + /* fprintf(stderr,"Child - %d %d\n",speed,failed); */ + fprintf(f, "%d %d %d\n", speed, failed, bytes); + fclose(f); + + return 0; + } else { + f = fdopen(mypipe[0], "r"); + if (f == NULL) { + perror("open pipe for reading failed."); + return 3; } - - printf("\n"); - */ - printf("Runing info: "); + setvbuf(f, NULL, _IONBF, 0); - 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(); -} + speed = 0; + failed = 0; + bytes = 0; -void build_request(const char *url) -{ - char tmp[10]; - int i; - - //bzero(host,MAXHOSTNAMELEN); - //bzero(request,REQUEST_SIZE); - memset(host,0,MAXHOSTNAMELEN); - memset(request,0,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; - - 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; - } + while (1) { + pid = fscanf(f, "%d %d %d", &i, &j, &k); + if (pid < 2) { + fprintf(stderr, "Some of our childrens died.\n"); + break; + } - strcat(request," "); + speed += i; + failed += j; + bytes += k; - 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 (0!=strncasecmp("http://",url,7)) - { - fprintf(stderr,"\nOnly HTTP protocol is directly supported, set --proxy for others.\n"); - exit(2); + /* fprintf(stderr,"*Knock* %d %d read=%d\n",speed,failed,pid); */ + if (--clients == 0) + break; } - - /* protocol/host delimiter */ - i=strstr(url,"://")-url+3; - 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"); - } - - 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"); - - printf("\nRequest:\n%s\n",request); + printf("\nSpeed=%d pages/min, %d bytes/sec.\nRequests: %d susceed, %d " + "failed.\n", + (int)((speed + failed) / (benchtime / 60.0f)), + (int)(bytes / (float)benchtime), speed, failed); + } + + return i; } -/* vraci system rc error kod */ -static int bench(void) -{ - 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; +void benchcore(const char *host, const int port, const char *req) { + int rlen; + char buf[1500]; + int s, i; + struct sigaction sa; + + /* setup alarm signal handler */ + sa.sa_handler = alarm_handler; + sa.sa_flags = 0; + if (sigaction(SIGALRM, &sa, NULL)) + exit(3); + + alarm(benchtime); // after benchtime,then exit + + rlen = strlen(req); +nexttry: + while (1) { + if (timerexpired) { + if (failed > 0) { + /* fprintf(stderr,"Correcting failed by signal\n"); */ + failed--; + } + return; } - /* 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) - { - /* 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; - } - } - if(close(s)) {failed++;continue;} - speed++; + if (close(s)) { + failed++; + continue; } + speed++; + } }