关键全局变量:
  speed 成功次数
  failed 失败次数
  bytes 接收字节数
  benchtime 执行时长(秒)
 
 
build_request() 函数:生成请求字符串。
一)请求第一行,如:GET /mall HTTP/1.0
  1. 根据命令行参数中的请求方法种类,把"GET"、"HEAD"、"OPTIONS"或"TRACE"相应复制到 request[]。
  2. 在request中,接下来添加一个空格。
  3. 如果命令行参数url不包含"://",则它不是个有效的URL,报错、退出。
  4. 如果url长度超过1500个字符,则太长,退出。
  5. 如果url开头不是"http://",则报错。
  6. 如果没有设置代理,则
    1. 从url中取主机名和端口号,分别填至host和proxyport
    2. 取路径部分,添加至 request
  7. 如果使用HTTP 1.0 或 1.1,则将 " HTTP/1.0" 或 " HTTP/1.1" 添加至 request。(注意前导空格)
    1. 如果使用HTTP 0.9,则无需添加此协议部分。
  8. 换行:添加 "\r\n" 至 request
二)请求后续行:
  1. 若HTTP版本在1.0及以上,则向request添加:"User-Agent: WebBench 1.5\r\n"。注意有换行。
  2. 若不使用代理,且版本在1.0以上,则向request添加主机头("Host: " + host)并换行。
  3. 若不使用代理,且强制刷新,则向request添加缓存控制(不缓存):"Pragma: no-cache\r\n"。
  4. 若版本在1.1及以上,则添加:"Connection: close\r\n"。
  5. 若版本在1.0及以上,则再添加空行:"\r\n"。
  6. 结束。■
 
 
bench()函数:创建各子进程以发送HTTP请求,并收集统计数据。
  1. 检测目标服务器(URL中的host或者代理)是否可以连接:使用connect()。
  2. 创建一对管道:使用pipe()。
  3. 创建指定个数clients的子进程:使用fork()。
  4. 在子进程中:
    1. 调用 benchcore() 执行测试。
    2. 向管道写入三项数据:速度、失败次数、字节数。
    3. 结束。■
[在父进程中]
  1. 循环 clients次,反复执行:
    1. 从管道读入下一个子进程的三项数据:速度、失败次数、字节数。
    2. 若读入项数少于3,说明已无数据可读、或其余子进程已提前结束,跳出循环。
    3. 累计三项数据
  2. 打印统计结果:
    1. 速度:分两项
      1. 总请求数 / 时间 = (speed+failed)/,单位:次/分
      2. 总字节数 / 时间,单位:字节/秒
    2. 成功次数:speed
    3. 失败次数:failed
  3. 结束。■
 
benchcore()函数:(在子进程中)反复发送HTTP请求。
  1. 使用SIGALRM安装定时器:时长来自命令行参数。
  2. 循环 直到定时器超时:
    1. 连接服务器(或代理服务器),得fd;若连接失败,则失败次数 failed 增1,跳至下一轮循环
    2. 向fd写入请求串;若写入失败,则 failed 增1,关闭fd,跳至下一轮循环
    3. 若采用HTTP/0.9协议,则停止发送:使用shutdown();
    4. 若要等服务器响应,则
      1. 反复从fd读出响应数据,直到读入0字节(表示读完),累计字节数至 bytes。
      2. 若出错,则 failed 增1,关闭fd,跳至下一轮循环
    5. 关闭fd。若出错,则 failed 增1。
    6. 累加成功次数 speed。
  3. 结束。■
 
 
学习到的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
 
 
 

WebBench源码分析与心得的更多相关文章

  1. [软件测试]网站压测工具Webbench源码分析

    一.我与webbench二三事 Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能.Webbench ...

  2. WebBench源码分析

    源码分析共享地址:https://github.com/fivezh/WebBench 下载源码后编译源程序后即可执行: sudo make clean sudo make & make in ...

  3. 网站(Web)压测工具Webbench源码分析

    一.我与webbench二三事 Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能.Webbench ...

  4. 基于python的ardrone control源码分析与心得

    这里有一段python代码,可用于操控ardrone 2.0.实验室曾经借鉴用过,并添加了部分功能.如今复习一下,顺便理理python的相关知识点. #!/usr/bin/env python # A ...

  5. jQuery 源码分析和使用心得 - 序

    众所周知, jQuery (个人简称为jq) 在前端开发中占有着非常重要的地位, 可以说jQuery的存在大大降低了学习网页设计和交互的门槛, 他的简单的语法和顺畅的使用逻辑激发了人们强烈的学习兴趣, ...

  6. [心得体会]SpringMVC源码分析

    1. SpringMVC (1) springmvc 是什么? 前端控制器, 主要控制前端请求分配请求任务到service层获取数据后反馈到springmvc的view层进行包装返回给tomcat, ...

  7. [心得体会]spring事务源码分析

    spring事务源码分析 1. 事务的初始化注册(从 @EnableTransactionManagement 开始) @Import(TransactionManagementConfigurati ...

  8. AngularJS 源码分析1

    AngularJS简介 angularjs 是google出品的一款MVVM前端框架,包含一个精简的类jquery库,创新的开发了以指令的方式来组件化前端开发,可以去它的官网看看,请戳这里 再贴上一个 ...

  9. Tomcat源码分析

    前言: 本文是我阅读了TOMCAT源码后的一些心得. 主要是讲解TOMCAT的系统框架, 以及启动流程.若有错漏之处,敬请批评指教! 建议: 毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, ...

随机推荐

  1. EditTextPreference点击后输入框显示隐藏内容,类似密码输入(转)

    http://bbs.anzhuo.cn/thread-928131-1-1.html EditTextPreference点击后输入框显示隐藏内容,类似密码输入... [复制链接]     aski ...

  2. Python——函数的命名关键字参数

    命名关键字参数 对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数.至于到底传入了哪些,就需要在函数内部通过kw检查. 仍以person()函数为例,我们希望检查是否有city和job参数: ...

  3. C++ --- Hellowrod

    #include <iostream> int main() { ) { using namespace std; cout << "helloword"; ...

  4. 苗子sale record

    2016年7月11日 橘白/阳光 发广州 220  中通 719373064939 成功2016年7月11日 横纹RA    发潮州 250  中通 719373064940 成功2016年7月18日 ...

  5. [z]oracle job

    我们在项目开发中,常常会有一些复杂的业务逻辑.使用oracle的存储过程,可以大大减少Java程序代码的编写工作量,而且存储过程执行在数据库上,这样可以利用oracle的良好性能支持,极大地提高程序执 ...

  6. HR开发 获取信息类型数据

    1.PNP逻辑数据库. LOOP获取信息类型数据. TABLES: PERNR . , . START-OF-SELECTION. GET PERNR . LOOP AT P0000 WHERE .. ...

  7. linux driver编译环境搭建和命令

    首先将ubuntu14.04的内核升级到内核3.18.12. 其次,Ubuntu14.04上驱动编译命令 $ sudo make -C ~/linux-3.18.12/ M=`pwd` modules ...

  8. aspx页面调用发送邮件验证码(结合前两篇)

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs ...

  9. 拓扑排序(topsort)

    本文将从以下几个方面介绍拓扑排序: 拓扑排序的定义和前置条件 和离散数学中偏序/全序概念的联系 典型实现算法解的唯一性问题 Kahn算法 基于DFS的算法 实际例子 取材自以下材料: http://e ...

  10. rdlc报表大小设置

    参考:http://stackoverflow.com/questions/427730/how-to-limit-rdlc-report-for-one-page-in-a-pdf 主要设置为:报表 ...