⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webclient.c

📁 ACE源码
💻 C
📖 第 1 页 / 共 3 页
字号:

    for (cnt = 0; cnt < maxcount; cnt++)
    { 
	D_PRINTF( "Loop count %d in makeload()\n", cnt );
	if (pageval == -1)
	{
	    pageval = cnt;
	}
	if (timeexpired) 
	{
	    break;
	}

	/* check for a filename */
	if (strlen(load_file_list[pageval].filename[cnt]) < 1)
	{
	    D_PRINTF( "Bad filename at pageval %d, count %d\n", 
		pageval, cnt );
	    return(returnerr("Bad filename at pageval %d, count %d\n", 
		pageval, cnt));
	}
      
        /*        if (load_file_list[pageval].port_number[cnt] != 0)
        {
            loc_portnum = load_file_list[pageval].port_number[cnt];
        }
        else
        {
            loc_portnum = portnum;
        } */
        loc_portnum = portnum;
        if ((load_file_list[pageval].servername[cnt] != NULL) 
	      &&
	    *load_file_list[pageval].servername[cnt])
	{
	    D_PRINTF( "Copying URL server %s to server\n",
		load_file_list[pageval].servername[cnt] );
	    strcpy(server, load_file_list[pageval].servername[cnt]);
	}

	if (haveproxyserver)
	  {
	    D_PRINTF( "Copying proxy %s to webserver\n", proxyserver );
	    strcpy(server, proxyserver);
	  }


	D_PRINTF( "Calling get(%s, %d, %s, &(timearray[%d]))\n",
	    server, loc_portnum, load_file_list[pageval].filename[cnt],
	    cnt );

	returnval = get(server, loc_portnum, 
			  load_file_list[pageval].filename[cnt],
			  &(timerarray[cnt]));
	if (returnval < 0)
	{
	    D_PRINTF( "***GET() RETURNED AN ERROR\n" );
	}
     
	/* 
	* DID GET() RETURN A VALID TIME?
	*/
	if ((returnval == 0) && (timerarray[cnt].valid == 2))
	{
	    timerarray[cnt].page_number = pageval;

	    accumstats(&timerarray[cnt], &page_stats_tmp, timestat);
	}
	else if (!timeexpired) /* INVALID, INCREMENT THE ERROR COUNTER */
	{
	    D_PRINTF( "GET error counter incremented\n" );
	    timestat->rs.totalerrs++;
	}

	if (amclient) {
	    fd_set readfds;
	    struct timeval timeout;
	    int rv;

	    timeout.tv_sec = 0;
	    timeout.tv_usec = 0;
	    FD_ZERO(&readfds);
	    FD_SET(mastersock, &readfds);

	    /* if the webmaster has aborted, quit */
	    D_PRINTF("Before select() on webmaster socket\n");
	    if (rv = select(FD_SETSIZE, &readfds, NULL, NULL, &timeout))  {
		D_PRINTF("select() returned %d\n", rv);
		D_PRINTF("Client terminating at request of webmaster\n");
		exit(2);
	    }
	}

    } /* END for cnt */
  
    /* 
     * DO WE HAVE A VALID RETURN FROM GET()? 
     * WHY NOT USE returnval HERE?
     */
    if ((returnval == 0) &&
	  (cnt == load_file_list[pageval].num_of_files) && 
	  (timerarray[cnt-1].valid == 2))
    {
	rqst_stats_t *ps_rs;
	rqst_stats_t *pst_rs;

	ps_rs = &(page_stats[pageval].rs);
	pst_rs = &(page_stats_tmp.rs);

	rqstat_sum(ps_rs, pst_rs);

	page_stats[pageval].totalpages++;
      
	if (page_stats[pageval].page_size == 0)
	{
	    page_stats[pageval].page_size = (unsigned)
		page_stats_tmp.rs.totalbody;
	}
    }

    D_PRINTF( "\nMakeload output page %d: %d errors, %d pages\n",
	    pageval, timestat->rs.totalerrs, page_stats[pageval].totalpages );
    D_PRINTF( "Makeload returning %d\n", cnt );

    return(cnt);

} /* END makeload() */

#ifdef WIN32
/* close socket library at exit() time */
void sock_cleanup(void) {

    WSACleanup();
}
#endif /* WIN32 */

/* globalize variables that were in main() */
long int 	numfiles = 0;
int	testtime = 0;
int	numloops = 0;
int	numclients = 0;
int	record_all_transactions = 0;
int	uil_filelist_f = 0; /* filedescriptor of URLs to fetch? */
int	verbose = 0;
int     total_weight;
char	uil_filelist[NCCARGS];
char 	filelist[MAXNUMOFFILES][MAXPATHLEN];
char	configfile[MAXPATHLEN];
char	connectstr[MAXHOSTNAMELEN+10];

void
main(int argc, char *argv[])
{
    int		file_count=0;
    int		getoptch;
    int		currarg;
    extern char	*optarg;
    extern int	optind;
    int 	i, j;
    char 	*tempch;
    int 	err;

#define SLEEP_USEC  100
#ifdef WIN32
    WSADATA 	WSAData;
#else

    struct timeval sleeptime;

    /* set the amount of time that we'll pause before sending a "." to the
       webmaster */

    sleeptime.tv_sec = SLEEP_USEC/1000000;
    sleeptime.tv_usec = SLEEP_USEC % 1000000;
#endif /* WIN32 */

    debugfile = stderr;

#ifdef WIN32
    MessageBeep(~0U);	/* announce our existence */
    MessageBeep(~0U);
    MessageBeep(~0U);

    err = WSAStartup(MAKEWORD(1,1), &WSAData);
    if (err != 0) {
	errexit("Error in WSAStartup()\n");
    }

    atexit(sock_cleanup);

    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);

    /* create semaphore in locked state */
    hSemaphore = CreateSemaphore(NULL, 0, 1, NULL);
    if(hSemaphore == NULL)
    {
	errexit("Create semaphore failed: %d", GetLastError());
    }
#endif /* WIN32 */

    memset(webserver, 0, sizeof(webserver));
    memset(webmaster, 0, sizeof(webmaster));
    memset(proxyserver, 0, sizeof(proxyserver));
    memset(connectstr, 0, sizeof(connectstr));

    /* 
     * PARSE THE COMMAND LINE OPTIONS
     */

    while((getoptch = getopt(argc,argv,"P:f:t:l:p:u:R:w:c:n:sdv")) != EOF)
    {
        switch(getoptch)
        {
	case 'c':
            sprintf(connectstr, "%s", optarg);
	    amclient = 1;
            printf("%s", OKSTR);     /* sent back to webmaster */
            fflush(stdout);
	    break;
        case 'd':
            debug = 0; /* sumedh */
            break;
	case 'f':
	    sprintf(configfile, "%s", optarg);
	    break;
        case 'l':
            numloops = atoi(optarg);
            break;
        case 'n':
            numclients = atoi(optarg);
            break;
	case 'u':
	    sprintf(uil_filelist, "%s", optarg);
	    uil_filelist_f = 1;
	    break;
	case 'p':
	    portnum = atoi(optarg);
	    break;
	case 's':
	    savefile = 1;
	    break;
        case 't':
            testtime = 60 * atoi(optarg);
            break;
	case 'v':
	    verbose = 1;
	    break;
        case 'w':
            havewebserver = 1;
            sprintf(webserver,"%s",optarg);
            break;
	case 'P':
	    haveproxyserver = 1;
	    sprintf(proxyserver, "%s", optarg);
	    break;
	case 'R':	
	    record_all_transactions = 1;
	    break;
        default:
            usage(argv[0]);
        }
    }

    returnerr("Client begins...\n");
    D_PRINTF( "Running in debug mode\n\n" );

    /* print the command line */
    for (i = 0; i < argc; i++)
	D_PRINTF( "%s ", argv[i] );
    D_PRINTF( "\n\n" );

    if(testtime && numloops)
    {
	/*
         * EITHER numloops OR testtime, BUT NOT BOTH.
         */
        usage(argv[0]);
    }

    if(havewebserver != 1)
    {
#ifdef WIN32
        /*
         * THE SERVER'S NAME MUST BE SPECIFIED
         */
        returnerr("No WWW Server specified\n");
        usage(argv[0]);
#else
	/* IF IT ISN'T, WE ASSUME LOCALHOST */
	sprintf(webserver, "%s", "localhost");
	havewebserver = 1;
#endif /* WIN32 */
    }

    currarg = optind;
    numfiles = 0;
    while(currarg != argc)
    {
       /*
        * GET THE URLS TO RETRIEVE.
        */        
       if (numfiles == MAXNUMOFFILES) {
	   returnerr("Maximum of %d files on the command line.\n");
	   usage(argv[0]);
       }
       sscanf(argv[currarg],"%s",filelist[numfiles]);
       numfiles++;
       currarg++;
    }

    if ((numfiles != 0) && uil_filelist_f)
    {
	returnerr("Both a filelist and UIL specified.\n");
	usage(argv[0]);
    }

    if((numfiles == 0) && !(uil_filelist_f))
    {
        /*
         * AT LEAST ONE FILE MUST BE SPECIFIED
         */
	returnerr("No UIL resources or filelist specified \n");
        usage(argv[0]);
    }

    if((numloops == 0) && (testtime == 0))
    { 
        /*
         * NO SPECIFIED NUMBER OF LOOPS, AND NO TEST TIME
         */
       usage(argv[0]);
    }
    if(numclients > MAXPROCSPERNODE || numclients < 1)
    {
	returnerr("Number of Clients must be between 1 and %d\n", MAXPROCSPERNODE);
	exit(1);
    }

    /* allow use of IP address */
    if(amclient) {
	if((tempch = strpbrk(connectstr,":")) == NULL)
	{
	    /*
	     * INCORRECT FORMAT OF ConnectStr. CORRECT FORMAT IS
	     * HOSTNAME:PORT OR HOST-IP:PORT
	     */
	    D_PRINTF( "Incorrect format %s: use hostname:port or ip_addr:port\n",
		     connectstr );
	    returnerr("Incorrect format %s: use host:port or ip_addr:port\n", connectstr);
	    exit(1);
	} else {
	    strncpy(webmaster, connectstr, tempch-connectstr);
	}
	if(resolve_addrs(webmaster, "tcp", &webmast_phe, &webmast_ppe, &webmast_addr, &webmast_type))
	    exit(1);
    }

    if (haveproxyserver)
    {
	D_PRINTF( "Copying proxy %s to webserver\n", proxyserver );
	strcpy(webserver, proxyserver);
    }

    if (resolve_addrs(webserver, "tcp", &webserv_phe, &webserv_ppe, &webserv_addr, &webserv_type))
	exit(1);
    
    /*
     * INITIALIZE DATA
     */
    /* allocate space for dynamic arrays */
    load_file_list = 
      (page_list_t *)mymalloc((MAXNUMOFPAGES)*sizeof(page_list_t));

    if (uil_filelist_f)
    {
      /* take a guess at the number of URLs in the file */
      D_PRINTF( "About to parse filelist %s\n", uil_filelist );
      number_of_pages = count_file_list(uil_filelist);
      numfiles = 1;

      /* IF WE HAVE A FILELIST, PARSE IT */
      /* allocate memory */
      D_PRINTF( "Allocating page list: %ld by %d\n",
	number_of_pages, numfiles );
      for (i=0; i<number_of_pages; i++)
	{
	  for (j=0; j<MAXNUMOFFILES; j++)
	    {
	      load_file_list[i].servername[j] = 
		(char *)mymalloc(URL_SIZE);
	      load_file_list[i].filename[j] =
		(char *)mymalloc(URL_SIZE);
	    }
	}

      D_PRINTF( "Parsing file list: %s\n", uil_filelist );
      parse_file_list(uil_filelist, load_file_list, 
		      &number_of_pages, &numfiles);
      /* free memory for pages that won't be used? */
      D_PRINTF( "Actual page list: %ld by %d\n",
	number_of_pages, MAXNUMOFFILES );

      D_PRINTF( "Setting up weighting for %ld pages\n", 
	number_of_pages );
      total_weight = load_percent(load_file_list, number_of_pages);
      /*      total_weight = load_percent(load_file_list, number_of_pages, pages); */
    }
    else
    {
	/* no uil file */
	number_of_pages = numfiles;
    }

    if (number_of_pages < 1)
      {
	/* no pages - exit */
	D_PRINTF( "No valid URLs found\n" );
	errexit("No valid URLs found\n");
      }

#ifndef WIN32
    /*
     * IF WE ARE TO FORK ADDITIONAL CLIENTS ON THIS MACHINE,
     * WE MUST DO IT BEFORE WE CONNECT TO THE MASTER.
     *
     * FIRST, SET UP SIGNAL HANDLING
     */
    signal(SIGCHLD, childhandler);
    for(i = 0; i < numclients; i++)
    {
      thr_create (NULL, NULL, ClientThread, NULL, THR_BOUND, NULL); 

      /* switch(fork()) 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -