Ubuntu 下安装使用
1、安装依赖包CTAGS
sudo apt-get install ctage
2、下载及安装 Webbench
http://home.tiscali.cz/~cz210552/webbench.html
解压:
tar -zxvf webbench-1.5.tar.gz
切换到解压后的目录:
cd webbench-1.5
编译:
make
安装:
sudo make install
webbench使用
#webbench -? (查看命令帮助)
常用参数 说明,-c 表示客户端数,-t 表示时间
./webbench -c 500 -t 30 http://xyzp.xaut.edu.cn/Plugins/YongHu_plug/Pages/loginbysjy.aspx
代码学习:
众所周知,C程序的主函数有两个参数,其中第一个参数是整数,可以获得包括程序名字的参数个数,第二个参数是字符数组或字符指针的指针,可以按顺序获得命令行上各个字符串的参数。其原型是:
int main(int argc, char const *argv[])
或者
int main(int argc, char const **argv)
有鉴于此,在Unix和Linux的正式项目上,程序员通常会使用getopt()或者getopt_long()来获得输入的参数。两者的区别在于getopt()仅支持短格式参数,而getopt_long()既支持短格式参数,也支持长格式参数。
./webbench -V
1.5
./webbench --version
1.5
关于getopt_long()的具体用法参考:man getopt_long
在处理命令行参数时,用到一个变量 optind, 原来是系统定义的。
可以在命令行中,通过 man optind 来看相关信息
optind: the index of the next element to be processed in the argv. The system initializes it to 1. The caller can reset it to 1 to restart scanning of the same argv or scanning a new argument vector.
当调用 getopt() , getopt_long() 之类的函数时, optind 的值会变化。如:
执行 $ ./a.out -ab 当调用 一次 getopt() , 则 optind 值会 +1
进程间通信的方式之管道:管道分为无名管道(匿名管道)和命名管道
使用无名管道,则是通信的进程之间需要一个父子关系,通信的两个进程一定是由一个共同的祖先进程启动。但是无名管道没有数据交叉的问题。
使用命名管道可以解决无名管道中出现的通信的两个进程一定是由通一个共同的祖先进程启动的问题,但是为了数据的安全,很多时候要采用阻塞的FIFO,让写操作变成原子操作。
1 /* $Id: socket.c 1.1 1995/01/01 07:11:14 cthuang Exp $ 2 * 3 * This module has been modified by Radim Kolar for OS/2 emx 4 */ 5 6 /*********************************************************************** 7 module: socket.c 8 program: popclient 9 SCCS ID: @(#)socket.c 1.5 4/1/94 10 programmer: Virginia Tech Computing Center 11 compiler: DEC RISC C compiler (Ultrix 4.1) 12 environment: DEC Ultrix 4.3 13 description: UNIX sockets code. 14 ***********************************************************************/ 15 16 #include <sys/types.h> 17 #include <sys/socket.h> 18 #include <fcntl.h> 19 #include <netinet/in.h> 20 #include <arpa/inet.h> 21 #include <netdb.h> 22 #include <sys/time.h> 23 #include <string.h> 24 #include <unistd.h> 25 #include <stdio.h> 26 #include <stdlib.h> 27 #include <stdarg.h> 28 29 30 /* 31 根据通信地址和端口号建立网络连接 32 @host:网络地址 33 @clientPort:端口号 34 成功返回建立连接套接字 35 建立套接字失败返回-1 36 */ 37 int Socket(const char *host, int clientPort) 38 { 39 int sock; 40 unsigned long inaddr; 41 struct sockaddr_in ad; 42 struct hostent *hp; 43 44 memset(&ad, 0, sizeof(ad)); 45 ad.sin_family = AF_INET; 46 //将点分十进制的IP地址转化为无符号的长整形 47 inaddr = inet_addr(host); 48 if (inaddr != INADDR_NONE) 49 memcpy(&ad.sin_addr, &inaddr, sizeof(inaddr)); 50 else 51 { 52 //如果host是域名,则通过域名获取IP地址 53 hp = gethostbyname(host); 54 if (hp == NULL) 55 return -1; 56 memcpy(&ad.sin_addr, hp->h_addr, hp->h_length); 57 } 58 ad.sin_port = htons(clientPort); 59 60 sock = socket(AF_INET, SOCK_STREAM, 0); 61 if (sock < 0) 62 return sock; 63 if (connect(sock, (struct sockaddr *)&ad, sizeof(ad)) < 0) 64 return -1; 65 return sock; 66 }
1 /* 2 * (C) Radim Kolar 1997-2004 3 * This is free software, see GNU Public License version 2 for 4 * details. 5 * 6 * Simple forking WWW Server benchmark: 7 * 8 * Usage: 9 * webbench --help 10 * 11 * Return codes: 12 * 0 - sucess 13 * 1 - benchmark failed (server is not on-line) 14 * 2 - bad param 15 * 3 - internal error, fork failed 16 * 17 */ 18 #include "socket.c" 19 #include <unistd.h> 20 #include <sys/param.h> 21 #include <rpc/types.h> 22 #include <getopt.h> 23 #include <strings.h> 24 #include <time.h> 25 #include <signal.h> 26 27 /* values */ 28 volatile int timerexpired=0; 29 int speed=0; 30 int failed=0; 31 int bytes=0; 32 /* globals */ 33 int http10=1; /* 0 - http/0.9, 1 - http/1.0, 2 - http/1.1 */ 34 /* Allow: GET, HEAD, OPTIONS, TRACE */ 35 #define METHOD_GET 0 36 #define METHOD_HEAD 1 37 #define METHOD_OPTIONS 2 38 #define METHOD_TRACE 3 39 #define PROGRAM_VERSION "1.5" 40 int method=METHOD_GET; 41 int clients=1; 42 int force=0; 43 int force_reload=0; 44 int proxyport=80; 45 char *proxyhost=NULL; 46 int benchtime=30; 47 /* internal */ 48 int mypipe[2]; 49 50 //主机名的最大长度通常是由头文件<sys/param.h>定义的常值MAXHOSTNAMELEN 51 char host[MAXHOSTNAMELEN]; 52 #define REQUEST_SIZE 2048 53 char request[REQUEST_SIZE]; 54 55 static const struct option long_options[]= 56 { 57 {"force",no_argument,&force,1}, 58 {"reload",no_argument,&force_reload,1}, 59 {"time",required_argument,NULL,'t'}, 60 {"help",no_argument,NULL,'?'}, 61 {"http09",no_argument,NULL,'9'}, 62 {"http10",no_argument,NULL,'1'}, 63 {"http11",no_argument,NULL,'2'}, 64 {"get",no_argument,&method,METHOD_GET}, 65 {"head",no_argument,&method,METHOD_HEAD}, 66 {"options",no_argument,&method,METHOD_OPTIONS}, 67 {"trace",no_argument,&method,METHOD_TRACE}, 68 {"version",no_argument,NULL,'V'}, 69 {"proxy",required_argument,NULL,'p'}, 70 {"clients",required_argument,NULL,'c'}, 71 {NULL,0,NULL,0} 72 }; 73 74 /* prototypes */ 75 static void benchcore(const char* host,const int port, const char *request); 76 static int bench(void); 77 static void build_request(const char *url); 78 79 static void alarm_handler(int signal) 80 { 81 timerexpired=1; 82 } 83 84 static void usage(void) 85 { 86 fprintf(stderr, 87 "webbench [option]... URL " 88 " -f|--force Don't wait for reply from server. " 89 " -r|--reload Send reload request - Pragma: no-cache. " 90 " -t|--time <sec> Run benchmark for <sec> seconds. Default 30. " 91 " -p|--proxy <server:port> Use proxy server for request. " 92 " -c|--clients <n> Run <n> HTTP clients at once. Default one. " 93 " -9|--http09 Use HTTP/0.9 style requests. " 94 " -1|--http10 Use HTTP/1.0 protocol. " 95 " -2|--http11 Use HTTP/1.1 protocol. " 96 " --get Use GET request method. " 97 " --head Use HEAD request method. " 98 " --options Use OPTIONS request method. " 99 " --trace Use TRACE request method. " 100 " -?|-h|--help This information. " 101 " -V|--version Display program version. " 102 ); 103 }; 104 105 106 107 int main(int argc, char *argv[]) 108 { 109 int opt=0; 110 int options_index=0; 111 char *tmp=NULL; 112 113 if(argc==1) 114 { 115 usage(); 116 return 2; 117 } 118 119 //解析命令行参数 120 while((opt=getopt_long(argc,argv,"912Vfrt:p:c:?h",long_options,&options_index))!=EOF ) 121 { 122 switch(opt) 123 { 124 case 0 : break; 125 case 'f': force=1;break; 126 case 'r': force_reload=1;break; 127 case '9': http10=0;break; 128 case '1': http10=1;break; 129 case '2': http10=2;break; 130 case 'V': printf(PROGRAM_VERSION" ");exit(0); 131 case 't': benchtime=atoi(optarg);break; 132 case 'p': 133 /* proxy server parsing server:port */ 134 tmp=strrchr(optarg,':'); 135 proxyhost=optarg; 136 if(tmp==NULL) 137 { 138 break; 139 } 140 if(tmp==optarg) 141 { 142 fprintf(stderr,"Error in option --proxy %s: Missing hostname. ",optarg); 143 return 2; 144 } 145 if(tmp==optarg+strlen(optarg)-1) 146 { 147 fprintf(stderr,"Error in option --proxy %s Port number is missing. ",optarg); 148 return 2; 149 } 150 *tmp='