Please indicate the source: http://blog.csdn.net/gaoxiangnumber1
Welcome to my github: https://github.com/gaoxiangnumber1
- webtest工作的第五步是根据用户输入参数进行实际测试,对应函数
void TestMain();
。整体逻辑分为4步。
- 创建管道。对于所有的库函数call error,使用
perror
函数打印出此时errno
值对应的字符串,然后终止程序。 - 创建子进程。对于子进程pid == 0:在循环体内立刻执行
break;
,避免子进程再创建子进程。 - 对于父进程:
(1). 从管道中读取子进程写的测试数据。注意将读取stream设为unbuffered。
(2). 计算总测试结果,并打印输出,webtest成功结束。 - 对于子进程:
(1). 设置alarm_handler,并开始计时alarm(test_time);
。当test_time expired时,handler将全局变量timer_expired
设为1,代表测试时间已完成,不能继续测试。
(2). 进行实际的Http transaction,转交给函数void HttpTransaction(const char *host, const int port, const char *request)
。
(3). 测试完毕,将测试得到的数据写给父进程,终止子进程。
- 创建管道。对于所有的库函数call error,使用
HttpTransaction(const char *host, const int port, const char *request)
逻辑:在未超时的前提下(timer_expired == 0),执行死循环,共4步。
- 通过
TcpConnect
函数创建与server的Tcp连接。 - 写入(write)已经写好的request。
- 如果用户没有设置force选项,读取server的reply。
- 关闭socket,返回第一步。
- 通过
void HttpTransaction(const char *host, const int port, const char *request)
{
int req_len = strlen(request), socket, read_bytes;
char buf[MAX_BUF_SIZE];
for(int read_error = 0;;)
{
if(timer_expired) // If have received alarm signal.
{
// When timer expired, os will send SIGALRM signal that will interrupt(errno = EINTR)
// slow system calls(connect, write, read and so on, see APUE.), that is, every time the