项目要求
目的
自己模拟一个curl函数,但是curl命令是自己构造一个HTTP请求发送给我们的目标服务器,而我们是自己构造一个HTTP请求发送给我们的命令行参数第二个参数(url),然后再从服务器端接受响应打印到标准输出
我们的执行命令是
./client https://www.baidu.com/
程序开始执行之后根据提示从标准输入中一行一行的读取字符串然后去构造HTTP请求
HTTP报文的一些知识
HTTP请求格式
1.无body
2.有body
例子
而我们要构造的HTTP请求是这样的,这是我从fidder中从浏览器中随便抓包出来的一个HTTP请求,其中第一行是首行,从第二行开始就是header,其实我们随便什么请求都可以都是从标准输入中读取的而已,我们下面的这个只是举个栗子而已
CONNECT www.baidu.com:443 HTTP/1.1
Host: www.baidu.com:443
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
项目过程
1.首先用域名解析函数来解析我们输入的域名解析出我们的IP,端口号一般的浏览器是都80
我们所用的域名解析函数如下
此函数的一般使用方法如下,我下面写了一个例子
#include <netdb.h>
struct hostent *gethostbyname(const char * hostname);
例子:从标准输入中读一个url,并对它进行解析,解析出IP,输出
int main(int argc, char *argv[])
{
struct hostent *h;
char hostname[40];
printf("请输入域名\n");
scanf("%s",hostname);
getchar();
if((h=gethostbyname(hostname))==NULL)
{
fprintf(stderr,"不能得到IP\n");
exit(1);
}
printf("HostName :%s\n",h->h_name);
printf("IP Address :%s\n",inet_ntoa(*((struct in_addr *)h->h_addr)));
return EXIT_SUCCESS;
}
2.解析出IP之后进行socket的连接,使用connect函数
connect函数
函数定义:int connect(SOCKET s, const struct sockaddr * name, int namelen);
函数说明:
s:标识一个未连接socket
name:指向要连接套接字的sockaddr结构体的指针
namelen:sockaddr结构体的字节长度
3.连接成功服务器之后开始根据提示构造HTTP请求
write函数
函数定义:ssize_t write (int fd, const void * buf, size_t count);
函数说明:
write()会把参数buf所指的内存写入count个字节到参数放到所指的文件内。
如果顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno中。
4.发送成功了之后,再使用read函数从socket中读取HTTP响应
read函数
函数定义:ssize_t read(int fd, void * buf, size_t count);
函数说明:
read()会把参数fd所指的文件传送count 个字节到buf 指针所指的内存中。
返回值为实际读取到的字节数, 如果返回0, 表示已到达文件尾或是无可读取的数据。若参数count 为0, 则read()不会有作用并返回0。
5.最后我们将我们读到的HTTP响应进行处理了之后打印到标准输出上
贴上处理HTTP响应的函数
服务器性能测试的常用指标
【吞吐量】 固定时间间隔内的处理完毕事务个数。通常是1秒内处理完毕的请求个数,单位:事务/秒(tps)。
【平均吞吐量】一段时间内吞吐量的平均值。无法体现吞吐量的瞬间变化。
【峰值吞吐量】一段时间内吞吐量的最大值。是用来评估系统容量的重要指标之一。
【最低吞吐量】一段时间内吞吐量的最小值。如果最小值接近0,说明系统有“卡”的现象。
【70%的吞吐量集中区间】通过统计15%和85%的吞吐量边界值,计算出70%的吞吐量集中区间。区间越集中,吞吐量越稳定。
【响应时间】一次事务的处理时间。通常指从一个请求发出,到服务器进行处理后返回,再到接收完毕应答数据的时间间隔,单位:毫秒。
【平均响应时间】 一段时间内响应时间的平均值。无法体现响应时间的波动情况。
【中间响应时间】一段时间内响应时间的中间值,50%响应时间,有一半的服务器响应时间低于该值而另一半高于该值。
【90%响应时间】一段时间内90%的事务响应时间比此数值要小。反应总体响应速度,和高于该值的10%超时率。是用来评估系统容量的重要指标之一。
【最小响应时间】响应时间的最小值。反映服务最快处理能力。
【最大响应时间】响应时间的最大值。反映服务器最慢处理能力。
【CPU占用率】1-CPU空闲率,表示CPU被使用情况,反映了系统资源利用情况。
项目感悟
最后通过这次的项目,对HTTP请求又有了更深入的了解,遇到了一些困难但是最后还是都完美解决,虽然项目中存在一些小细节的问题,总体来说还是大致正确的能发送给服务器请求还能从服务器端接受响应并打印,之后再在慢慢修改吧
最后贴上项目的码云地址,有兴趣的可以下载看看