简单说下程序的逻辑吧:
一个无限循环,一个请求,创建一个线程,之后线程处理函数处理每个请求,然后解析HTTP请求,然后做一些判断处理,之后判断文件是否可执行,不可执行则打开文件,输出给客户端(浏览器)呗,可执行就创建管道,父子进程通信。
整个流程就这么简单,程序主要处理2种HTTP请求方式:GET和POST。
main函数中:
首先调用startup函数:在服务端设置socket,绑定端口号,然后建立监听socket
while循环:进入循环,服务器通过调用accept等待客户端的连接,accept会以阻塞的方式运行,直到有客户端连接才会返回。连接成功后,服务器调用pthread_create启动一个新的线程(accept_request)来处理客户端的请求,处理完成后,重新(accept)等待新的客户端请求。
处理请求(accept_request)的流程:
1 从客户端读取请求行(GET /index.html HTTP/1.1)
2 判断请求方法,如果不是GET或者POST,返回服务端无法实现错误501
3 读取buf中请求行中的url
4 对于GET请求,得到请求文件路径,请求文件存放在httpdocs文件夹下,主要是test.html和post.html,判断请求文件是否有效,如果有效,根据cgi的值,进行静态解析或者cgi动态展示
5 如果GET请求的是test.html,直接读取文件返回给请求的http客户端,调用serve_file函数。流程:先把请求头剩余内容读出(get_line)并忽略,然后调用headers函数向客户端发送请求成功响应头,调用cat向客户端发送test.html文件。
6 如果GET请求的是post.html文件,调用execute_cgi函数,创建子进程,父进程读取post.html界面,通过POST请求发送给服务端的注册信息,输出给子进程,子进程运行cgi脚本,并将结果写给父进程,父进程发送给客户端。
7 关闭与客户端的连接
注意:
从socket中读取文件统一用send,recv
管道间通信用read,write。
区别:
https://blog.csdn.net/petershina/article/details/7946615
tiny httpd 的框架:
参考:https://www.jianshu.com/p/18cfd6019296
https://www.cnblogs.com/qiyeboy/p/6296387.html
http://armsword.com/2014/10/29/tinyhttpd-code-analyse/
https://blog.csdn.net/yzhang6_10/article/details/51534409#commentBox
https://blog.csdn.net/jcjc918/article/details/42129311#commentBox