wuzizhongqiu / web-server

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

自主Web服务器实现

项目起源

父亲节快到了,我想给我父亲做一个网页版的贺卡, 在校期间,搭建了web服务器给父亲准备了可以直接通过链接在网页访问的父亲节祝福。

介绍

实现基本的HTTP/1.0版本的web服务器,通过浏览器发送HTTP请求,服务端进行响应,然后在网页上反馈用户请求的信息。

项目技术

C++,socket套接字,多线程编程,管道,CGI技术,(MySQL(待学习))

开发环境

Linux,Makefile,vim,gdb,g++

项目成果

用线程池技术提供服务的HTTP服务器,

客户端能够使用GET,POST方法请求资源,实现基本的短连接服务,

服务器将客户请求的资源以html页面呈现,支持css、js等其他资源的响应,

能够进行差错处理:请求资源失败将返回404的页面,

服务器能够进行简单的CGI运行,例:当用户往表单输入数据,服务器能够处理并返回结果给用户,

(服务器接入数据库(待实现))

项目模块

tcp_server.hpp

套接字服务模块

用基本的套接字:socket,bind,listen实现一个基本的套接字服务,让服务器进入监听状态,

并构建了一个单例,直接调用getinstance(端口号)就能使用该服务。

http_server.hpp

服务接口提供模块

提供基于单例模式实现的套接字服务接口,和线程池服务,

让服务器通过accept套接字循环接收可能出现的客户端请求,

process_protocol.hpp

核心功能实现模块

功能包括:读取并分析http请求,构建并发送http响应,

目前只支持POST和GET方法,

如果用户使用POST方法或者在使用GET方法的时候,URI带有参数,就会使用CGI技术处理数据,

通过父子进程间的匿名管道通信完成数据的传输,通过程序替换执行GCI程序,通过环境变量传输方法给CGI程序。

如果用户不传递参数给服务器,服务器将默认返回一个静态网页。

如果用户进行了错误的数据传输,或者访问了不存在的资源等等错误行为,将返回404页面。

log.hpp

日志信息模块

使用宏定义实现了简单的日志接口,可以在有需要的地方添加日志,方便观察程序的差错。

my_tool.hpp

自定义工具模块

设计了应对跨平台的读行工具,用于按行读取HTTP报文,

设计了字符串分割工具,用于分割具有特定分割符的字符串数据。

task.hpp

任务转接模块

通过设置回调函数连通process_protocol.hpp模块的任务。

thread_pool.hpp

线程池服务模块

构建了一个单例的线程池服务,产生的线程会自动执行任务队列中的任务,

如果线程池的线程用完了,线程池会重新定义,补充线程数量。

main.cc

主函数所在位置

提供了可执行程序的调用方法提示,

调用了服务接口模块提供的接口,让程序跑起来。

test_cgi.cc

一个CGI程序

这个CGI程序目前支持处理首页的表单里面提交的数据进行加减乘除运算。

Makefile

自动化构建工具

包含make自动编译,make clean自动清理,make output自动打包。

build.sh

可执行脚步程序

包含命令:make clean,make,make output。执行后自动清理,编译并打包。

wwwroot

存放网页信息的根目录

该目录目前存在的网页信息有:拥有能够实现简单计算的表单的首页,两张父亲节贺卡。

About


Languages

Language:HTML 81.3%Language:C++ 18.3%Language:Makefile 0.3%Language:Shell 0.0%