原来一直都在做单片机,大三上学期刚准备做互联网,所以开始学C++,数据结构。一直都在学最基础的东西,没有用过框架,也基本没有熟悉那么多API,所以想通过接触一个小的开源程序学习,目的很多,想学习web sever的工作原理,因为将来肯定会做相关的业务,不了解一个本质不利于深入。
要做一个http server肯定要了解一下基础的知识,必须要清楚的就是浏览器输入一个url后是怎么和服务器通信获得资源的。要想搞清楚这个问题,必须明白以下几个知识点:
0、http协议
1、http工作原理
2、http请求、响应步骤
http协议:这里http协议不说协议内容,说一下到底什么是协议。协议其实就是双方的规定,双方都按照这个规定来,这样双方都知道彼此的意思。比如规定电报要用莫斯编码的方式发送,你用别的编码就解析不到正确的结果。 http协议就是一个超文本协议,其实就是一个字符串,不过这个字符串比较特殊,每一段代表什么含义都是已经确定好的。
http工作原理:http协议定义了web客户端如何从web服务器请求资源,web服务器怎么把资源传送给web客户端。采用的是请求、响应模型。客户端发送一个请求报文请求数据,服务器发送响应报文返回数据。
http请求,响应步骤:
1、客户端连接web服务器
2、客户端发送http请求报文
3、服务器接受请求报文,返回一个响应报文
4、释放tcp连接
5、客户端解析响应报文
写到这里,就明白了输入一个url后怎么得到数据的。如果不清楚请求报文,响应报文的可以看看我转载的一篇博客。http协议
接下来就正式进入tinyhttpd的环节了,分析一个程序,肯定要从主函数看起,直接贴出代码,根据代码去分析流程。
int main(void)
{
int server_sock = -1;
u_short port = 0;
int client_sock = -1;
struct sockaddr_in client_name;
socklen_t client_name_len = sizeof(client_name);
pthread_t newthread;
/*建立服务端的socket,开启监听*/
server_sock = startup(&port);
printf("httpd running on port %d\n", port);
/*阻塞知道有客户端连接,此时会开启一个线程去处理客户端的请求*/
while (1)
{
client_sock = accept(server_sock,
(struct sockaddr *)&client_name,
&client_name_len);
if (client_sock == -1)
error_die("accept");
if (pthread_create(&newthread , NULL, accept_request, (void *)&client_sock))
perror("pthread_create");
}
close(server_sock);
return(0);
}
根据我在程序中的注释,我们知道main函数中就是服务端申请了一个套接字后开启监听,一旦有客户端连接,立即开一个线程去处理客户端的请求。最后释放了套接字资源。
其实main函数中只有两个函数,一个startup,另一个accept_request,具体的内容先不用着急去看代码,先根据注释知道大概函数功能就可以,学习开源的程序不能直接一上来就看代码,必须对这个程序有一个大概的认识,从整体上有了认识后再深入细节,后面我们开始具体的分析每个函数。