基於HTTP協議實現的小型web伺服器

2021-07-30 19:14:48 字數 2164 閱讀 1369

我們先了解一下這個專案最終能達到的乙個目標,然後以這個來進行專案的分析:

1、實現最基本的http/1.0版本的web伺服器,客戶端能夠使用get、post方法請求資源

2、伺服器將客戶請求的資源以html頁面的形似呈現,並能夠進行差錯處理(如:客戶請求的資源不存在時,伺服器能夠返回乙個404的頁面)

3、伺服器能進行簡單的cgi執行。比如當客戶在表單中輸入資料後,伺服器能夠將執行結果返回個客戶

4、能夠通過頁面對資料庫進行操作,如增刪查改等操作

1、http協議是基於tcp通訊的協議,因此,實現web伺服器的第一步至少要能實現兩個主機不同程序之間的tcp通訊。

2、接下來的部分就是比較主要的處理邏輯了,當伺服器收到請求後,首先應該分析請求方法(因為web伺服器是要支援cgi的,但請求方法不同處理cgi也不同,這裡我們只處理get和post方法)。

3、當方法確定後,應該拿到請求的url,這一步是為了我們後邊能處理get和post方法的cgi(get和post的引數位置不同,get的引數在url中,post的引數在請求正文中)

4、判斷資源是否存在,如果存在,判斷這個資源是乙個目錄、普通檔案還是乙個可執行程式。之前幾步我們已經提取到url以及引數。get方法:如果沒有引數,就直接將請求的資源返回(即進入非cgi模式執行);否則,進入cgi模式內部執行;只要是post方法就需要支援cgi:直接進入cgi函式內部執行。

非cgi模式:

進入非cgi模式時一定是get方法且沒有引數,此時進入echo_www()函式內部即可,該函式會將所請求的資源以html的格式返回給瀏覽器。

cgi模式:

上述這張圖描述了執行cgi時的過程,首先伺服器要從瀏覽器上讀取引數,然後需要fork出乙個子程序進行cgi部分的處理,父程序通過環境變數的方式將引數轉交給子程序,子程序執行完成後,將結果交給父程序,父程序再將資料輸出給瀏覽器。在這個過程中可以將父程序看作乙個所謂的中間量,只進行了引數的轉交,因此可以將子程序的輸入輸出檔案描述符進行重定向,即子程序直接與瀏覽器「聯絡」。

下面總結出父子程序內部各自需要幹的事情:

錯誤處理這部分的實現可以參考echo_www()函式,但需要改變響應的訊息報頭的格式,即改變狀態碼,狀態碼描述,以及返回的頁面。例如當請求的資源不存在時,伺服器需要返回給瀏覽器乙個預設的404頁面,告訴客戶請求的資源不存在。效果如圖:

目錄:

cgi:執行cgi部分的實現**

conf:配置檔案,存放需要繫結的伺服器的ip和port

log:shell的日誌檔案以及http錯誤處理的日誌檔案

lib:mysql需要的lib庫

sql_client:mysql部分的api及cgi實現

wwwroot:web伺服器工作的根目錄,包含各種資源頁面(例如預設的index.html頁面,差錯處理的404頁面),以及執行cgi的可執行程式

檔案:

configure.sh:sheel指令碼,執行該shell指令碼後需要自動生成makefile檔案

http_ctl.sh:伺服器控制指令碼,需要實現伺服器的啟動、暫停以及重新啟動

httpd.pid:與http_ctl.sh配合使用。如果把伺服器變成守護程序在後台執行,重新啟動時就需要檢測伺服器是否啟動,該檔案存放伺服器啟動以後的程序id

httpd.h:伺服器的方法宣告

httpd.c:方法實現

main.c:伺服器的主邏輯

請求資源存在:

執行cgi後:

附:

Linux專案 基於HTTP協議的自主web伺服器

前言在學習了網路基礎方面的知識後,想要將自己所學習的網路知識應用到實踐中,因此,模擬實現乙個基於http協議的小型web伺服器 專案描述 採用b s模型或者c s模型 瀏覽器 伺服器模型 編寫支援中小型應用的http,理解常見網際網路應用行為 從上網到關閉瀏覽器的所有操作 模擬實現了使用瀏覽器上網背...

基於HTTP 協議認證介紹與實現

一直對http 的頭認證有興趣,就是路由器的那種彈出對話方塊輸入賬號密碼怎麼實現一直不明白,最近,翻了一下http 協議,發現這是乙個rfc 2617的實現,所以寫篇文章介紹一下吧.這是乙個用於web瀏覽器或其他客戶端在請求時提供使用者名稱和密碼的登入認證,要實現這個認證很簡單 我們先來看下協議裡面...

基於HTTP功能追加的協議

隨著web用途的多樣性,http協議上的限制以及自身效能問題逐漸顯露出來,http功能上的不足可以通過建立一套全新的協議來彌補。可是目前基於http的web瀏覽器使用環境遍布全球,因此無法拋棄http。一些新的協議在http的基礎上新增了新的功能。為了盡可能實時顯示這些更新的內容,伺服器上一有內容更...