tester.c
上传用户:ladybrid91
上传日期:2007-01-04
资源大小:287k
文件大小:2k
源码类别:

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** tester.c
  3. **
  4. ** Copyright (c) 1994 Peter Eriksson <pen@signum.se>
  5. **
  6. ** This program is free software; you can redistribute it and/or modify
  7. ** it under the terms of the GNU General Public License as published by
  8. ** the Free Software Foundation; either version 2 of the License, or
  9. ** (at your option) any later version.
  10. **
  11. ** This program is distributed in the hope that it will be useful,
  12. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ** GNU General Public License for more details.
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program; if not, write to the Free Software
  17. ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <signal.h>
  22. #include <unistd.h>
  23. #include <wait.h>
  24. #include <sys/types.h>
  25. #include <sys/socket.h>
  26. #include <netinet/in.h>
  27. #include <arpa/inet.h>
  28. void do_test(struct sockaddr *sa, char *object)
  29. {
  30.     FILE *fp_in, *fp_out;
  31.     int fd;
  32.     int j;
  33.     int len = (unsigned) rand() % 32768 + 236;
  34.     fd = socket(AF_INET, SOCK_STREAM, 0);
  35.     
  36.     if (connect(fd, sa, sizeof(struct sockaddr_in)) < 0)
  37.     {
  38. perror("connect");
  39. exit(1);
  40.     }
  41.     
  42.     fp_out = fdopen(fd, "w");
  43.     fp_in  = fdopen(dup(fd), "r");
  44.     
  45.     fprintf(fp_out, "GET %s HTTP/1.0rn", object);
  46.     fprintf(fp_out, "From: Ptesterrnrn");
  47.     fflush(fp_out);
  48.     
  49.     for (j = 0; j < len && getc(fp_in) != EOF; j++)
  50. ;
  51.     
  52.     fclose(fp_in);
  53.     fclose(fp_out);
  54. }
  55. int main(int argc, char *argv[])
  56. {
  57.     struct sockaddr_in sin;
  58.     int n_testers, i, j, k;
  59.     int n_tests;
  60.     int status;
  61.     
  62.     if (argc < 6)
  63.     {
  64. fprintf(stderr,
  65. "Usage: %s <address> <port> <testers> <tests> <object>n",
  66. argv[0]);
  67. exit(1);
  68.     }
  69.     sin.sin_family = AF_INET;
  70.     sin.sin_addr.s_addr = inet_addr(argv[1]);
  71.     sin.sin_port = htons(atoi(argv[2]));
  72.     n_testers = atoi(argv[3]);
  73.     n_tests   = atoi(argv[4]);
  74.     printf("n_tests = %dn", n_tests);
  75.     
  76.     for (i = 0; i < n_testers; i++)
  77.     {
  78. if (fork() == 0)
  79. {
  80.     for (k = 0; k < n_tests; k++)
  81.     {
  82. for (j = 5; j < argc; j++)
  83.     do_test((struct sockaddr *) &sin, argv[j]);
  84.     }
  85.     exit(0);
  86. }
  87.     }
  88.     
  89.     while (wait(&status) >= 0)
  90. ;
  91.     exit(0);
  92. }