基于httpd的HTTP server

操作系统:CentOs 6.5

工具:Vim、gcc、g++、Makefile、Mysql


源代码:https://github.com/ZhaoGuanwen/HTTP-Server


主要工作流程:

wKioL1fw1I6S7TjfAAE5J3FouqI805.jpg-wh_50


所有函数声明:

wKiom1fw1oHS3V5XAADneIKG4iM079.jpg



main函数:

wKioL1fw1tjzHl6iAACAj0yN9F8881.jpg


当启动服务器时输入的参数(要绑定HTTP服务的ip地址,端口号)错误时,usage函数打印出正确方法。

wKioL1fw2FPRU3ReAAAb0PRaeTM062.jpg


start_up()函数创建一个监听套接字,检测是否有新的请求。

wKioL1fw4iKB-zBrAACdXD5OGhw055.jpg


当接收到一个新的请求时,派生一个新的线程执行accept_request()函数去处理。

1. 调用get_line()函数提取请求行

2. 从请求行中提取请求方法、请求URL、请求资源的路径

3. 判断是否含有cgi程序

wKiom1fw2iCw6u2CAA6aHkr-bAM120.jpg


get_line()函数读取sock中的一行数据(最大长度len)到line中。

wKiom1fw2q2gH4EfAABlR6u11uI885.jpg



clear_header()函数清除剩余的头部信息。

wKioL1fw3InSDSatAAAtj4FtJmk099.jpg


如果请求的资源存在并且是非cgi程序,echowww()将该资源发送给请求方。

wKioL1fw3nGhWZj2AABrkFjnNYU105.jpg


如果请求的资源是cgi程序,exec_cgi()函数运行cgi程序,并将运行结果发送给请求方。

wKiom1fw4O2DYBanAA5MFfr2-58368.jpg


echo_errno()函数将错误码发送给请求方

wKiom1fw4pOxW5IZAABMgCvf41M291.jpg


处理的错误码有400(Bad Request)、404(Not Found)、405(Method Not Allowed)、500(Internal Server Error)。

wKioL1fw41fCVi2RAAowi0Dk1xg834.jpg


Makefile:

wKioL1fw5IizNiEgAAZahha0H6c485.jpg


写一个简单的cgi程序测试。


math_cgi.cpp

wKioL1fw5XKgj5D9AAzmxBXHlu0634.jpg

index.html

wKioL1fw7-3zs0ivAABi8zeSY7Y122.jpg



wKioL1fw8Hnic4qFAACSXBWytUU786.jpg

wKiom1fw8HqCr0s5AAC7jZUxFQY838.jpg