fd=fileno(fp);
while((lock_reg(fd,f_setlk,f_wrlck,0,seek_set,0))==-1); /* 给文件加锁 */
fscanf(fp,"%d\t%d",&a,&b); /* 从文件得到当前数据 */
if(recvn)
b+=recvn; /* 如果connect成功,接收数据量累加 */
else
a--; /* connect失败,完成次数减一 */
rewind(fp);
fprintf(fp,"%d\t%d",a,b); /* 写入文件 */
lock_reg(fd,f_setlk,f_unlck,0,seek_set,0); /* 解锁 */
fclose(fp);
return(0);
}
/*-------------------------------------------------------------------*/
/* 使用记录锁对共享文件进行保护 */
int
lock_reg(int fd,int cmd,int type,off_t offset,int whence,off_t len)
{
struct flock lock;
lock.l_type=type; /* f_rdlck,f_wrlck,f_unlck */
lock.l_start=offset; /* byte offset, 起始处的相对偏移量 */
lock.l_whence=whence; /* seek_set,seek_cur,seek_end */
lock.l_len=len; /* 区域的长度(为0表示到最大位置为止) */
return(fcntl(fd,cmd,&lock)); /* 使用记录锁 */
}
/*--------------------------------------------------------------------*/
/* 输出结果 */
static void
output_results(void)
{
float takentime;
file *fp;
fp=fopen("temp.log","r");
fscanf(fp,"%d\t%d",&done,&recvdatas); /* 从文件中获取数据 */
takentime=((float)take_time.tv_sec)+((float)take_time.tv_usec)/1000000.0f; /* 格式化为整数+小数形式 */
printf("\n\n");
printf("server hostname: %s\n",hostname); /* 主机名 */
printf("server port: %hd\n",80); /* 端口 */
printf("document path: /%s\n",pathname); /* 请求路径名 */
printf("\n");
printf("total requests: %d\n",requests); /* 请求数 */
printf("concurrency level: %d\n",concurrency); /* 并发数 */
printf("time taken for tests: %ld.%03ld seconds\n",take_time.tv_sec,take_time.tv_usec); /* 总耗时 */
printf("complete requests: %ld\n",done); /* 完成请求数 */
printf("failed requests: %ld\n",(requests-done)); /* 失败请求数 */
printf("total transferred: %ld bytes\n",recvdatas); /* 总接收数据量 */
printf("\n");
if(takentime){
printf("requests per second: %.2f [#/sec] (mean)\n",(float)(done/takentime)); /* 每秒完成请求数 */
printf("time per request: %.3f [ms] (mean)\n",(float)(1000*concurrency*takentime/done));/* 完成一个并发请求的时间 */
printf("time per request: %.3f [ms] (mean, across all concurrent requests)\n",(float)(1000*takentime/done)); /* 完成一个请求的时间 */
printf("transfer rate: %.2f [kbytes/sec] received\n",(float)(recvdatas/takentime/1024)); /* 每秒传输数据量 */
}
printf("\n");
}
/*---------------------------------------------------------------------*/
/* 处理子进程sigchld信号 */
static void
sig_chld(int signo)
{
pid_t pid;
int stat;
while((pid=waitpid(-1,&stat,1))>0) /* 处理已结束子进程状态,防止子进程zombie状态出现 */
lflag--; /* 标志减一 */
return;
}
/*---------------------------------------------------------------------*/
/* 提示信息 */
static void
usage(const char *progname)
{
fprintf(stderr, "usage: %s [options] [http://]hostname/path\n", progname);
fprintf(stderr, "options are:\n");
fprintf(stderr, " -n requests number of requests to perform\n");
fprintf(stderr, " -c concurrency number of multiple requests to make\n");
fprintf(stderr, " -v print version number and exit\n");
fprintf(stderr, " -h display usage information (this message)\n");
exit(0);
}
/*----------------------------------------------------------------------*/
/* 出错处理函数 */
static void
err(char *s)
{
fprintf(stderr, "%s\n", s);
exit(1);
}
/*----------------------------------------------------------------------*/
/* 版本信息 */
static void
copyright(void)
{
printf("this is servertest for my pngserver, version 1.0\n");
printf("copyright (c) 2004-2005 xiongbin xiong all rights reserved\n");
printf("hustxxb@hotmail.com\n");