咱們先了解一下這個項目最終能達到的一個目標,而後以這個來進行項目的分析: html
一、實現最基本的HTTP/1.0版本的web服務器,客戶端可以使用GET、POST方法請求資源 mysql
二、服務器將客戶請求的資源以html頁面的形似呈現,並可以進行差錯處理(如:客戶請求的資源不存在時,服務器可以返回一個404的頁面) git
三、服務器能進行簡單的cgi運行。好比當客戶在表單中輸入數據後,服務器可以將運行結果返回個客戶 github
GET方法使用的是帶參數的URL,即傳遞的參數會使用?鏈接在資源路徑後邊;POST方法使用的是不帶參數的URL,它的參數是經過http請求報頭中的請求消息體傳遞給服務器的。
sql
響應報頭中的狀態碼和狀態碼描述,例如:當請求的資源不存在時,會收到「404 NotFound」的頁面,404就是狀態碼,「NotFound」就是狀態碼描述,即請求的文件不存在。
shell
一、http協議是基於TCP通訊的協議,所以,實現web服務器的第一步至少要能實現兩個主機不一樣進程之間的TCP通訊。 數據庫
二、接下來的部分就是比較主要的處理邏輯了,當服務器收到請求後,首先應該分析請求方法(由於web服務器是要支持cgi的,但請求方法不一樣處理cgi也不一樣,這裏咱們只處理GET和POST方法)。 瀏覽器
三、當方法肯定後,應該拿到請求的URL,這一步是爲了咱們後邊能處理GET和POST方法的cgi(GET和POST的參數位置不一樣,GET的參數在URL中,POST的參數在請求正文中) 服務器
非cgi模式:
進入非cgi模式時必定是GET方法且沒有參數,此時進入echo_www()函數內部便可,該函數會將所請求的資源以html的格式返回給瀏覽器。
wwwroot:web服務器工做的根目錄,包含各類資源頁面(例如默認的index.html頁面,差錯處理的404頁面),以及執行cgi的可執行程序
configure.sh:sheel腳本,運行該shell腳本後須要自動生成Makefile文件
http_ctl.sh:服務器控制腳本,須要實現服務器的啓動、暫停以及從新啓動
httpd.pid:與http_ctl.sh配合使用。若是把服務器變成守護進程在後臺運行,從新啓動時就須要檢測服務器是否啓動,該文件存放服務器啓動之後的進程id
https://github.com/lybb/Linux/tree/master/httpd
附:
這裏是我遇到的一些問題,粘出來,也多是你遇到的問題:
一、本地環回測試ok,Linux下的瀏覽器測試也能夠,但不能接外部的瀏覽器訪問(沒有設置橋接模式)嗯~要是在外部瀏覽器測試的話千萬別忘記關閉防火牆
二、服務器應答時,沒有將html格式的頁面發送,而是將底層的實現代碼展現在瀏覽器,而且在調試時將原本要打印的調試信息會打印到網頁上(在迴應空行時將send指望發送的數值寫的太大,原本只須要發送兩個字節的內容) 解決:先檢查代碼,思路正確,在容易出現問題的地方加入調試信息,最後將問題定位在echo_www()函數內
三、不能顯示圖片(這個問題是沒有將全部發送的狀況考慮徹底,只考慮到目錄、可執行程序,但沒有考慮到若是請求的是一個路徑明確的普通文件) 解決:測試請求一個路徑明確的test.html文件,加入調試信息 ,將問題定位在:若是請求的資源存在,應該如何處理。對於普通文件,找到後並回顯給瀏覽器;若是是目錄,應答的是默認頁面;若是是可執行程序,執行後返回結果
四、能顯示圖片後,但顯示的不完整(緣由:echo_www中,指望讀取一行信息的line值過小,不能存下一張圖片)
五、運行cgi模式時,每次提交數據並進行submit後都會自動出現提醒下載的頁面 緣由:在響應報頭中,將Content-Type中的」text」寫成」test」。而瀏覽器對於不能識別或解析的實體,都會提醒用戶下載。