WebBench源码分析与心得
2024-10-19 03:32:24
关键全局变量:
speed 成功次数
failed 失败次数
bytes 接收字节数
benchtime 执行时长(秒)
build_request() 函数:生成请求字符串。
一)请求第一行,如:GET /mall HTTP/1.0
- 根据命令行参数中的请求方法种类,把"GET"、"HEAD"、"OPTIONS"或"TRACE"相应复制到 request[]。
- 在request中,接下来添加一个空格。
- 如果命令行参数url不包含"://",则它不是个有效的URL,报错、退出。
- 如果url长度超过1500个字符,则太长,退出。
- 如果url开头不是"http://",则报错。
- 如果没有设置代理,则
- 从url中取主机名和端口号,分别填至host和proxyport
- 取路径部分,添加至 request
- 如果使用HTTP 1.0 或 1.1,则将 " HTTP/1.0" 或 " HTTP/1.1" 添加至 request。(注意前导空格)
- 如果使用HTTP 0.9,则无需添加此协议部分。
- 换行:添加 "\r\n" 至 request
二)请求后续行:
- 若HTTP版本在1.0及以上,则向request添加:"User-Agent: WebBench 1.5\r\n"。注意有换行。
- 若不使用代理,且版本在1.0以上,则向request添加主机头("Host: " + host)并换行。
- 若不使用代理,且强制刷新,则向request添加缓存控制(不缓存):"Pragma: no-cache\r\n"。
- 若版本在1.1及以上,则添加:"Connection: close\r\n"。
- 若版本在1.0及以上,则再添加空行:"\r\n"。
- 结束。■
bench()函数:创建各子进程以发送HTTP请求,并收集统计数据。
- 检测目标服务器(URL中的host或者代理)是否可以连接:使用connect()。
- 创建一对管道:使用pipe()。
- 创建指定个数clients的子进程:使用fork()。
- 在子进程中:
- 调用 benchcore() 执行测试。
- 向管道写入三项数据:速度、失败次数、字节数。
- 结束。■
[在父进程中]
- 循环 clients次,反复执行:
- 从管道读入下一个子进程的三项数据:速度、失败次数、字节数。
- 若读入项数少于3,说明已无数据可读、或其余子进程已提前结束,跳出循环。
- 累计三项数据
- 打印统计结果:
- 速度:分两项
- 总请求数 / 时间 = (speed+failed)/,单位:次/分
- 总字节数 / 时间,单位:字节/秒
- 成功次数:speed
- 失败次数:failed
- 结束。■
benchcore()函数:(在子进程中)反复发送HTTP请求。
- 使用SIGALRM安装定时器:时长来自命令行参数。
- 循环 直到定时器超时:
- 连接服务器(或代理服务器),得fd;若连接失败,则失败次数 failed 增1,跳至下一轮循环
- 向fd写入请求串;若写入失败,则 failed 增1,关闭fd,跳至下一轮循环
- 若采用HTTP/0.9协议,则停止发送:使用shutdown();
- 若要等服务器响应,则
- 反复从fd读出响应数据,直到读入0字节(表示读完),累计字节数至 bytes。
- 若出错,则 failed 增1,关闭fd,跳至下一轮循环
- 关闭fd。若出错,则 failed 增1。
- 累加成功次数 speed。
- 结束。■
学习到的Linux API/C库函数:
getopt、getopt_long() 命令行参数解析,详见《使用GETOPT()处理命令行参数》
strstr() 在字符串中搜索另一个字符串
strchr() 从串头开始搜索单个字符
srrrchr() 从串尾开始搜索单个字符
strncasecmp() 串比较,大小写不敏感
strcspn(s1, s2) 返回n,表示从s1串头开始连续有n个字符都不在字符串s2中。例如 strcspn("My 1984", "0123456789") == 3。
fdopen、fprintf、fscanf、setvbuf 等流式库I/O函数。
fork、pipe 与进程有关的函数。
shutdown() 与 close() 的区别。
问题:
1、为什么sleep()能让子进程快点?
/* fork children */
for (i = ; i < clients; i++) {
pid = fork();
if (pid <= (pid_t) ) {
/* child process or error*/
sleep(); /* make children faster */
break;
}
}
杂项:
主机名最大长度:64
命令行最大长度:2048
/* 定义所在文件:/usr/include/asm/param.h */
#define MAXHOSTNAMELEN 64 /* max length of hostname */
#define COMMAND_LINE_SIZE 2048
最新文章
- [bzoj1068]压缩[区间动规]
- PHP反射获取类中的所有常量
- poj 2823 Sliding Window (单调队列入门)
- 快速反射DataTable
- springMVC学习篇 - 搭建环境及关键点
- cocos2d-x 卡牌翻牌效果的实现
- 程序里面的system.out.println()输出到其他位置,不输出到tomcat控制台。
- Html辅助方法 之 Form表单标签
- php导出CSV时,超长数字精度丢失问题与前导0的字符串丢失0的问题解决
- Cocos2d-X中实现批处理精灵
- 两本最近阅读的工具书的记录 关于Python和Linux命令行的 不喜勿喷 只是写给自己用
- Winform DevExpress控件库(二) 使用SplashScreenManager控件定制程序加载页面
- Java 控制语句
- Bytom BIP-32协议和BIP-44协议
- elasticsearch批量修改,批量更新某个字段
- Python学习笔记【第十四篇】:Python网络编程二黏包问题、socketserver、验证合法性
- Codeforces Round #324 (Div. 2) (哥德巴赫猜想)
- c语言中阶乘的精确值
- Object-C-Foundation-反射
- centos6.6安装hadoop-2.5.0(一、本地模式安装)