Please indicate the source: http://blog.csdn.net/gaoxiangnumber1
Welcome to my github: https://github.com/gaoxiangnumber1
- webtest工作的第一步是解析命令行参数,对应函数
ParseArguments(argc, argv);
。该函数主要逻辑有以下4个步骤:
- 根据参数个数判断是否合法:至少2个参数
./webtest <url>
。任何时候,若参数非法,那么向stdout/stderr输出提示信息并终止程序exit(BAD_PARAMETER);
。 - 如果参数个数合法,通过
getopt_long
函数(man 3 getopt_long)初始化每个选项对应的全局变量。特别的选项:
(1).-f|--force
:表示client与server连接成功(即connect成功),发送成功http request message后,client立刻关闭socket,不读取server的reply,然后进行下一次socket->connect->write->close
。
(2).-r|--reload
:表示当proxy server存在时,在http request message的header中加入Pragma: no-cache
。 - 解析选项成功后,必须还有一个url参数,否则参数非法。
- 如果上述全部成功,检测参数输入是否有意义,比如
clients >= 0
等等,如果不合适,恢复默认值。
- 根据参数个数判断是否合法:至少2个参数
- 宏定义:将所有函数返回值、支持的http method(共有4种)定义为宏,便于记忆、理解。
// Define return status codes
#define FAIL -1
#define SUCCESS 0
#define SERVER_ERROR 1 // Server is not on-line
#define BAD_PARAMETER 2 // Command-line parameters are bad.
#define INTERNAL_ERROR 3 // pipe() failed, fork() failed
// Support methods: GET, HEAD, OPTIONS, TRACE
#define METHOD_GET 0
#define METHOD_HEAD 1
#define METHOD_OPTIONS 2
#define METHOD_TRACE 3
- 每个选项对应某些全局变量,都有一个合理的默认值,在解析选项时修改。
// Globals:
int clients = 1; // The number of clients, default 1.
int force = 0; // 1 means Don't wait for reply from server.
char *proxy_host = NULL; // The proxy host name, default NULL.
int proxy_port = 80; // The proxy port number, default 80(http