tinyhttpd — 0 — main

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/king_qg/article/details/80918827

    原来一直都在做单片机,大三上学期刚准备做互联网,所以开始学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,具体的内容先不用着急去看代码,先根据注释知道大概函数功能就可以,学习开源的程序不能直接一上来就看代码,必须对这个程序有一个大概的认识,从整体上有了认识后再深入细节,后面我们开始具体的分析每个函数。


   

    

猜你喜欢

转载自blog.csdn.net/king_qg/article/details/80918827
今日推荐