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://blog.csdn.net/weixin_37977062?viewmode=contents

原创粉丝点击