本项目旨在利用c/c++,实现简单的web服务器,可以进行静态网页的读取,cgi机制的响应,通过本项目你可以更加深入的理解http协议,理解网络传输细节
Centos 7 vim /g++/gdb +c/c++
网络编程(TCP/IP协议,socket编程,http协议)
多线程技术
cgi机制
线程池
git clone https://github.com/qingyan520/Http_Server.gitcd Http_Server./re.sh
只需要上面这三步便可以将这个项目部署到自己的服务器上,当然,你也可以替换自己的网页到wwwroot目录下
rm -rf wwwrootmkdir wwwrootcd wwwrootrz -e 文件或者将文件托转到xshell中 cd .../re.sh #即可运行创建套接字
监听
绑定
监听
accept()
引入多线程/线程池处理
读取http响应(一行一行读取)
读取请求行
读取请求报头
将请求行拆分为method ,uri和version
利用map将请求报头差分为[key,value]形式
判读是否读取请求正文:判断方法是否为POST(注意将方法全部转化为大写),是POST,而后判断map[Content-Length]是否存在, 若上面两个要求都满足,则读取请求正文
将http请求读取完毕之后我们就需要进行http解析
首先判断请求方法是否合理,本项目只使用了GET/POST方法,如其他方法本项目一律设置为不合法
如果为GET方法,则判断是否在uri中带参数了,如果uri中含有?,那么?后面的就是参数,我们就截取?前面作为要访问资源的路径,?后面作为参数
如果为POST方法,那么uri就是要访问资源的路径了,
判断该路径的资源存不存在,如果是文件夹,后接index.html拼接路径,然后判断是否存在,若不存在
如果是二进制可以文件:引入cgi机制执行可执行文件处理数据
如果是文件就正常处理
处理cgi机制
fork父子进程,通过管道或者环境变量将数据发送给子进程进行处理,子进程将处理玩的数据通过管道交给父进程
非cgi机制
正常处理
根据上面操作的状态码构建http响应,构建响应行,响应报头,响应正文,如果是cgi机制就发送响应正文,非cgi机制就发送文件
到此,简单的http响应就处理完毕了
读取出错处理
在读取报头的时候会出现客户端关闭,客户端刷新等场景导致读取出错,在这种情况下我们就不进行后续操作了
写入出错处理
在server向客户端发送数据的时候,会出现客户端断开连接等导致写入出错的情况,此时会发出一个sigpipe的信号终止服务器进程,导致服务器奔溃,这时我们就忽略sigpipe信号

