webbench1.5源码读后总结
webbench简介
webbench由C语言写成的用于网站压力测试的一个非常简单的工具,它最多可以模拟30000个并发连接去进行测试。
webbench的安装和使用可以自行百度,也可以过下这篇文章。
webbench执行流程
命令行解析 --> 构建HTTP请求包 --> 创建指定数量的工作进程 --> 每个工作进程对测试网站在测试时间内持续发送请求/接收响应
具体分析
1. 命令行解析。
这里主要用到了getopt库。getopt库是C中常用的命令行解析库,具有如下一些常用的全局变量、结构体以及函数。
/* 常用全局变量 */ extern char* optarg; // 指向获取的option
extern int optind; // 已经解析过的option的个数
extern int opterr; // 错误码
extern int optopt;
/* 结构体:解析option时主要的结构体,用以指明有哪些指定options */
struct option {
const char* name;
int has_arg;
int* flag;
int val;
};
/* has_arg的几个宏 */
#define no_argument 0
#define require_argument 1
#define optional_argument 2
/* 常用的几个函数 */ int getopt(); int getopt_long(int __argc, char* const* __argv, const char* __shortopts, const struct option* __longopts, int* __longind); int getopt_long_only(int __argc, char* const* __argv, const char* __shortopts, const struct option* __longopts, int* __longind);
2. 构建HTTP请求包。
代码调用了build_request函数对HTTP请求包进行了构建。常见的HTTP请求包构建规则:
请求方法 URL 协议版本 \r\n
头部字段名: 值 \r\n
....
头部字段名: 值 \r\n
\r\n
\r\n
请求数据
请求方法:GET, POST, HEAD, PUT, DELETE, TRACE, CONNECT, OPTIONS
协议版本:HTTP/1.0 HTTP/1.1
头部: User-agent, Host, Pragma, Connection等等
3. 使用fork创建指定数量的工作进程,用pipe让主进程和工作进程建立通信,以便于主进程收集子进程的测试信息。
/* 使用fork创建多进程代码片段 */ static int bench(void)
{
...
for (i = ; i < clients; i++)
{
pid = fork();
if (pid <= ) // 如果是子进程或者fork失败了,退出这个循环
{
sleep();
break;
}
} ...
}
/* fork 函数声明 */ #include <unistd.h>
#include <sys/types.h> pid_t fork(void); // pid_t 在 sys/types.h 中定义 /* pipe 函数声明 */
#include <unistd.h> int pipe(int pipefd[]); /* fdopen 函数声明 */
#include <stdio.h> FILE *fdopen(int fd, const char *mode); // 打开 pipe 文件
4. 每个进程模拟一个客户端,创建socket并连接测试web,用alarm定时测试时长,在这个时间段里,客户端持续向web请求并接收响应。
这里有几点要注意:
a) 在客户端的socket需要两步完成对web的连接:创建一个socket(使用socket()函数);连接web(使用connect()函数)。
b) alarm定时时长,输入的参数只能是秒数。当定时时间到了的时候,系统会发送一个SIGALRM信号给alarm所在的进程,所以在调用alarm之前,需要注册一个信号函数sigaction或signal(代码中使用了sigaction),将SIGALRM与回调函数绑定,当系统发送SIGALRM,会调用相应的回调函数(代码中使用了alarm_handler)进行处理。
上面几个函数的声明如下
/* socket, connect 函数声明 */
#include <sys/types.h>
#include <sys/socket.h> int socket(int domain, int type, int protocol);
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); /* alarm 函数声明 */
#include <unistd.h> unsigned int alarm(unsigned int seconds); /* sigaction 函数声明 */
#include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigation *oldact); struct sigaction {
void (*sa_handler) (int);
void (*sa_sigaction) (int, siginfo_t*, void*);
sigset_t sa_mask;
int sa_flag;
void (*sa_restorer) (void);
};
完!
2018-03-21 23:39:46
webbench1.5源码读后总结的更多相关文章
- Python源码读后小结
Python 笔记 前言(还是叫杂记吧) 在python中一切皆对象, python中的对象体系大致包含了"类型对象", "Mapping对象(dict)", ...
- PHP源码安装后设置别名
PHP源码安装后测试是否能正常运行 每次在php目录./bin./php调用php很不方便,可以设置别名(方法一) vi ~/.bash_profile (修改根目录下这个文件) 设置完成后还 ...
- 复用微信小程序源码包后仍然有原小程序的版本管理怎么处理
前言: 复用微信小程序源码包后,重新创建项目导入源码包,会发现开发者工具版本管理中仍然有原来小程序的版本,这样就不太好了.毕竟是一个新的小程序,需要有新的版本控制的.那么这个问题怎么处理呢? 解决方案 ...
- vue打包时,assets目录 和static目录下文件的处理区别(nodeModule中插件源码修改后,打包后的文件应放在static目录)
为了回答这个问题,我们首先需要了解Webpack如何处理静态资产.在 *.vue 组件中,所有模板和CSS都会被 vue-html-loader 及 css-loader 解析,并查找资源URL.例如 ...
- Andriod下载源码导入后AndroidManifest.xml小红叉的解决办法
问题描述: 下载源码后,用eclipse导入,AndroidManifest.xml小红叉,而且AndroidManifest.xml打不开无法编译,请高人指点! 解决办法: 网上下载的工程文件夹不要 ...
- OpenERP 源码变更后数据库升级
转自:http://vivianyw.blog.163.com/blog/static/13454742220142114422130/?latestBlog OpenERP代码升级后需要对数据进行升 ...
- openfire源码修改后如何打包部署到linux服务器上
原文:http://blog.csdn.net/jinzhencs/article/details/50457152 1.linux版本的3.10.3解压部署启动(过程略,参考我的另一篇博文http: ...
- openfire源码编译后部署到linux
1.源码通过编号后,会生成target目录,直接把target目录拷贝到linux下即可: 2.启动openfire: ./openfire.sh start 3.退出直接ctr + c 问题:如果一 ...
- bilibili源码泄漏后,程序员们从代码里扒出来的彩蛋
昨天bilibili又上热搜了,被某人在github上开了个账号,传了份整个后端代码到github,这是被人扒光了衣服看个精光啊. 这件事情,作为程序员的我们除了调侃和fork的同时,想一想,造成这个 ...
随机推荐
- MySQL -- JDBC
一 . JDBC的开发步骤 1.准备四大参数 2.注册驱动 3.获得连接 4.获得语句执行者 5.执行sql语句 6.处理结果 7.释放资源 1.准备四大参数 /* * jdbc四大配置参数 * &g ...
- Runtime.getRuntime().exec 类 防止阻塞
import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; impor ...
- WCF - Autofac IOC
/// <summary> /// IOC实例提供者,基于AutoFac /// /// </summary> public class IocInstanceProvider ...
- 深入理解HashMap(及hash函数的真正巧妙之处)
原文地址:http://www.iteye.com/topic/539465 Hashmap是一种非常常用的.应用广泛的数据类型,最近研究到相关的内容,就正好复习一下.网上关于hashmap的文章很多 ...
- python基础学习之路No.1
版本python2 python语言不分"和',两者可以一样使用,同等效果 1.输出print python3中print是一个函数 print "hello world" ...
- COLLATE CHINESE_PRC_CI_AS_WS 的含义
排序规则:COLLATE CHINESE_PRC_CI_AS_WS 的含义 在创建数据表时,常会用到这个. 含义当中,CHINESE_prc_ 是代表中国大陆.如果是台湾,则如:Chinese_TAI ...
- Oracle学习笔记:trunc函数
在Oracle中可以使用trunc函数进行日期截取和数字截取,具体使用方法如下: 1.trunc(for dates) 日期截取 语法:trunc(date,[fmt]) select trunc(s ...
- IE源代码摘抄,基于泄漏的IE5.0(持续更新)
下载了一份很久以前泄漏的IE5.0的源代码,虽然已经是很古远的版本了.但是通过调试现有版本浏览器与查看源代码,发现关键部分的差距并不是很大,代码很有参考意义.这里把重要的函数.数据结构摘抄出来以备参考 ...
- Storm(二)CentOS7.5搭建Storm1.2.2集群
一.Storm的下载 官网下载地址:http://storm.apache.org/downloads.html 这里下载最新的版本storm1.2.2,进入之后选择一个镜像下载 二.Storm伪分布 ...
- 【LOJ】#2291. 「THUSC 2016」补退选
题解 在trie树上开vector记录一下这个前缀出现次数第一次达到某个值的下标,以及记录一下现在这个前缀有多少个 为什么thusc有那么水的题--是为了防我这种cai ji爆零么= = 代码 #in ...