標籤:http
基於httpd的HTTP server
作業系統:CentOs 6.5
工具:Vim、gcc、g++、Makefile、Mysql
原始碼:https://github.com/ZhaoGuanwen/HTTP-Server
主要工作流程:
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M01/88/55/wKioL1fw1I6S7TjfAAE5J3FouqI805.jpg-wh_500x0-wm_3-wmp_4-s_2304485477.jpg" title="HTTP_server主要工作流程.jpg" alt="wKioL1fw1I6S7TjfAAE5J3FouqI805.jpg-wh_50" />
所有函式宣告:
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/88/59/wKiom1fw1oHS3V5XAADneIKG4iM079.jpg" title="http_server.h.jpg" alt="wKiom1fw1oHS3V5XAADneIKG4iM079.jpg" />
main函數:
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M00/88/55/wKioL1fw1tjzHl6iAACAj0yN9F8881.jpg" title="main.jpg" alt="wKioL1fw1tjzHl6iAACAj0yN9F8881.jpg" />
當啟動伺服器時輸入的參數(要綁定HTTP服務的ip地址,連接埠號碼)錯誤時,usage函數列印出正確方法。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/88/55/wKioL1fw2FPRU3ReAAAb0PRaeTM062.jpg" title="usage.jpg" alt="wKioL1fw2FPRU3ReAAAb0PRaeTM062.jpg" />
start_up()函數建立一個監聽通訊端,檢測是否有新的請求。
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M00/88/55/wKioL1fw4iKB-zBrAACdXD5OGhw055.jpg" title="start_up.jpg" alt="wKioL1fw4iKB-zBrAACdXD5OGhw055.jpg" />
當接收到一個新的請求時,派生一個新的線程執行accept_request()函數去處理。
1. 調用get_line()函數提取請求行
2. 從請求行中提取要求方法、請求URL、請求資源的路徑
3. 判斷是否含有cgi程式
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/88/59/wKiom1fw2iCw6u2CAA6aHkr-bAM120.jpg" title="accept_request.jpg" alt="wKiom1fw2iCw6u2CAA6aHkr-bAM120.jpg" />
get_line()函數讀取sock中的一行資料(最大長度len)到line中。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/88/59/wKiom1fw2q2gH4EfAABlR6u11uI885.jpg" title="get_line.jpg" alt="wKiom1fw2q2gH4EfAABlR6u11uI885.jpg" />
clear_header()函數清除剩餘的頭部資訊。
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M01/88/55/wKioL1fw3InSDSatAAAtj4FtJmk099.jpg" title="clear_header.jpg" alt="wKioL1fw3InSDSatAAAtj4FtJmk099.jpg" />
如果請求的資源存在並且是非cgi程式,echowww()將該資源發送給請求方。
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/88/55/wKioL1fw3nGhWZj2AABrkFjnNYU105.jpg" title="echowww.jpg" alt="wKioL1fw3nGhWZj2AABrkFjnNYU105.jpg" />
如果請求的資源是cgi程式,exec_cgi()函數運行cgi程式,並將運行結果發送給請求方。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/88/59/wKiom1fw4O2DYBanAA5MFfr2-58368.jpg" title="exec_cgi.jpg" alt="wKiom1fw4O2DYBanAA5MFfr2-58368.jpg" />
echo_errno()函數將錯誤碼發送給請求方
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/88/59/wKiom1fw4pOxW5IZAABMgCvf41M291.jpg" title="echo_errno.jpg" alt="wKiom1fw4pOxW5IZAABMgCvf41M291.jpg" />
處理的錯誤碼有400(Bad Request)、404(Not Found)、405(Method Not Allowed)、500(Internal Server Error)。
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/88/55/wKioL1fw41fCVi2RAAowi0Dk1xg834.jpg" title="errno.jpg" alt="wKioL1fw41fCVi2RAAowi0Dk1xg834.jpg" />
Makefile:
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/88/55/wKioL1fw5IizNiEgAAZahha0H6c485.jpg" title="Makefile.jpg" alt="wKioL1fw5IizNiEgAAZahha0H6c485.jpg" />
寫一個簡單的cgi程式測試。
math_cgi.cpp
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/88/55/wKioL1fw5XKgj5D9AAzmxBXHlu0634.jpg" title="math_cgi.cpp.jpg" alt="wKioL1fw5XKgj5D9AAzmxBXHlu0634.jpg" />
index.html
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/88/56/wKioL1fw7-3zs0ivAABi8zeSY7Y122.jpg" title="index.jpg" alt="wKioL1fw7-3zs0ivAABi8zeSY7Y122.jpg" />
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/88/56/wKioL1fw8Hnic4qFAACSXBWytUU786.jpg" style="float:none;" title="test1.jpg" alt="wKioL1fw8Hnic4qFAACSXBWytUU786.jpg" />
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/88/59/wKiom1fw8HqCr0s5AAC7jZUxFQY838.jpg" style="float:none;" title="test2.jpg" alt="wKiom1fw8HqCr0s5AAC7jZUxFQY838.jpg" />
本文出自 “zgw285763054” 部落格,請務必保留此出處http://zgw285763054.blog.51cto.com/11591804/1858466
HTTP伺服器項目