webbench源码分析之benchcore函数
来源:互联网 发布:java基本类型内存分配 编辑:程序博客网 时间:2024/06/06 10:47
/******************************
这里才是测试http的地方 ,benchcore函数是子进程进行压力测试的函数,被每个子进程调用
@host:地址
@port:端口
@req:http格式方法
********************************/
//由于bench函数子进程调用了benchcore函数,而benchcore函数是测试函数,它通过使用SIGALARM信息来控制时间,
//alarm函数设置了多少时间之后产生SIGALRM信号,一旦产生此信息,将运行alam_handler函数,是的timerexpired=1,
//这样之后可以通过判断timerexpired值来退出程序。此外,全局变量force表示是否发出请求后需要等待服务器的相应结果。
void benchcore(const char *host, const int port, const char *req)
{
int rlen; // 记录服务器相应请求所返回的数据
char buf[1500];
int s, i;
struct sigaction sa;
/* setup alarm signal handler */
// 当程序执行到指定的秒数之后,发送SIGALRM信号,即设置alam_handler函数为信号处理函数
sa.sa_handler = alarm_handler;//定时器方法
sa.sa_flags = 0;
// sigaction成功则返回0,失败则返回-1,超时会产生信号SIGALRM,用sa指定函数处理
if(sigaction(SIGALRM, &sa, NULL))
exit(3);
// 开始计时
alarm(benchtime);
rlen = strlen(req);
// 无限执行请求,直到收到SIGALRM信号将timerexpired设置为1时
nexttry:while(1)
{
// 一旦超时,则返回
if(timerexpired)//定时器到时后,会设定timerexpired=1,函数就会返回
{
if(failed > 0)
{
/* fprintf(stderr,"Correcting failed by signal\n"); */
failed--;
}
return;
}
// 连接远程服务器,通过调用Socket函数建立TCP连接
s=Socket(host, port); //创建连接
if(s < 0) { failed++; continue;} //连接失败,failed加1
if(rlen!=write(s, req, rlen)) {failed++; close(s); continue;}//发送失败
// 针对http0.9做的特殊处理,则关闭socket的写操作,成功返回0,错误返回-1
if(http10 == 0)
if(shutdown(s, 1)) { failed++; close(s); continue;}
// 全局变量force表示是否要等待服务器返回的数据
// 如果等待数据返回,则读取响应数据,计算传输的字节数
// 发出请求后需要等待服务器的响应结果 force=0表示等待从Server返回的数据
if(force == 0) //force等于0表示要读取http请求数据
{
/* read all available data from socket */
while(1)
{
if(timerexpired) break; // timerexpired默认为0,在规定时间内读取当为1时表示定时结束
// 从socket读取返回数据
i=read(s, buf, 1500);
/* fprintf(stderr, "%d\n", i); */
if(i < 0)
{
failed++;
close(s);
goto nexttry;
}
else
if(i == 0) break;
else
bytes += i;//读取字节数增加
}
}
// 关闭连接
if(close(s)) {failed++; continue;}
// 成功完成一次请求,并计数,继续下一次相同的请求,直到超时为止
speed++;//http测试成功一次,speed加1
}
这里才是测试http的地方 ,benchcore函数是子进程进行压力测试的函数,被每个子进程调用
@host:地址
@port:端口
@req:http格式方法
********************************/
//由于bench函数子进程调用了benchcore函数,而benchcore函数是测试函数,它通过使用SIGALARM信息来控制时间,
//alarm函数设置了多少时间之后产生SIGALRM信号,一旦产生此信息,将运行alam_handler函数,是的timerexpired=1,
//这样之后可以通过判断timerexpired值来退出程序。此外,全局变量force表示是否发出请求后需要等待服务器的相应结果。
void benchcore(const char *host, const int port, const char *req)
{
int rlen; // 记录服务器相应请求所返回的数据
char buf[1500];
int s, i;
struct sigaction sa;
/* setup alarm signal handler */
// 当程序执行到指定的秒数之后,发送SIGALRM信号,即设置alam_handler函数为信号处理函数
sa.sa_handler = alarm_handler;//定时器方法
sa.sa_flags = 0;
// sigaction成功则返回0,失败则返回-1,超时会产生信号SIGALRM,用sa指定函数处理
if(sigaction(SIGALRM, &sa, NULL))
exit(3);
// 开始计时
alarm(benchtime);
rlen = strlen(req);
// 无限执行请求,直到收到SIGALRM信号将timerexpired设置为1时
nexttry:while(1)
{
// 一旦超时,则返回
if(timerexpired)//定时器到时后,会设定timerexpired=1,函数就会返回
{
if(failed > 0)
{
/* fprintf(stderr,"Correcting failed by signal\n"); */
failed--;
}
return;
}
// 连接远程服务器,通过调用Socket函数建立TCP连接
s=Socket(host, port); //创建连接
if(s < 0) { failed++; continue;} //连接失败,failed加1
if(rlen!=write(s, req, rlen)) {failed++; close(s); continue;}//发送失败
// 针对http0.9做的特殊处理,则关闭socket的写操作,成功返回0,错误返回-1
if(http10 == 0)
if(shutdown(s, 1)) { failed++; close(s); continue;}
// 全局变量force表示是否要等待服务器返回的数据
// 如果等待数据返回,则读取响应数据,计算传输的字节数
// 发出请求后需要等待服务器的响应结果 force=0表示等待从Server返回的数据
if(force == 0) //force等于0表示要读取http请求数据
{
/* read all available data from socket */
while(1)
{
if(timerexpired) break; // timerexpired默认为0,在规定时间内读取当为1时表示定时结束
// 从socket读取返回数据
i=read(s, buf, 1500);
/* fprintf(stderr, "%d\n", i); */
if(i < 0)
{
failed++;
close(s);
goto nexttry;
}
else
if(i == 0) break;
else
bytes += i;//读取字节数增加
}
}
// 关闭连接
if(close(s)) {failed++; continue;}
// 成功完成一次请求,并计数,继续下一次相同的请求,直到超时为止
speed++;//http测试成功一次,speed加1
}
}
更多精彩,请点击:http://blog.csdn.net/weixin_37977062?viewmode=contents
阅读全文
1 0
- webbench源码分析之benchcore函数
- webbench源码分析之bench函数分析
- webbench源码分析之main函数
- webbench源码分析之build_request函数
- webbench源码分析之usage函数
- webbench源码分析
- webbench源码分析
- webbench源码分析
- webbench源码分析(转)
- webbench源码分析
- Webbench源码分析
- Webbench源码分析
- webbench源码分析
- webbench源码分析
- Webbench源码分析之参数输入getopt_long(一)
- Webbench源码分析之socket及http协议(二)
- Webbench 源码分析 阅读笔记
- 压测工具webbench源码分析
- 根文件系统的制作
- mybatis 关联查询之association定义关联对象封装规则
- c++: 格式化打印日历一个月的所有日期
- 欢迎使用CSDN-markdown编辑器
- Maven的介绍
- webbench源码分析之benchcore函数
- 如何显示隐藏密码输入框的值?
- MapReduce阶段map的setup() 和cleanup()
- 一篇不大靠谱的常用正则表达式汇总(前端)
- 理解CSS3属性transition
- Map.Entry(转载)
- 1106. Lowest Price in Supply Chain (25)
- Quartz 2D Summary
- webbench源码分析之build_request函数