系列文章:
自己動手寫http伺服器(一) -- UNIX C 網絡程式設計
自己動手寫http伺服器(二) -- http協定分析
自己動手寫http伺服器(三) -- 代碼實作
有了前兩篇的描述,我們就能實作一個簡單的web伺服器了。
效果
先來介紹一下最終的效果:
我們通過編譯生成兩個可執行檔案: fhttpd 和 login.cgi,其中,fhttpd 是我們的web伺服器軟體,而 login.cgi 是用C語言編寫的可執行檔案,用于動态生成web頁面;
開啟伺服器并通路的過程如下:
1、啟動伺服器
通過指令
./fhttpd 端口号
指定在本機開啟的web服務端口,并啟動服務,如:

啟動web服務
我們就開啟了web服務,開啟的端口為 8888 ;
伺服器通路
在浏覽器中輸入 :
localhost:8888
就可通路啟動的伺服器:
通路Web服務
登陸
通過輸入使用者名和密碼,伺服器會校驗使用者是否存在,分為3種情況:
1、使用者名不存在
例如,輸入使用者名:foolish ,密碼:abc,web伺服器發現找不到該使用者名,則顯示如下:
使用者不存在
2、密碼不正确
例如,輸入使用者名:admin ,密碼:abc,顯示如下:
密碼錯誤
3、成功登入
例如:輸入使用者名:admin ,密碼:123456,顯示如下:
成功登入
源碼
源碼可以下載下傳zip包,位址為:
https://github.com/foolishflyfox/fhttpd/archive/master.zip
有git的同學也可以通過git下載下傳,使用指令:
git clone https://github.com/foolishflyfox/fhttpd.git
或
git clone [email protected]:foolishflyfox/fhttpd.git
均可下載下傳;
在這裡就不貼代碼湊字數了,需要的自己下 _
說明
這裡說一下代碼中的幾個檔案的用途:
- fhttpd.c : 伺服器源碼
- login.c:編譯出 login.cgi 的源檔案
- index.html : 隻在浏覽器中輸入 IP:端口号 将回報該html檔案;
其他的幾個很好了解,不再贅述;
要編譯出 fhttp 和 login.cgi ,隻須執行
make
指令即可;
代碼中的所有變量都用小駝峰命名法,結構體類型用大駝峰命名法,枚舉類型及宏定義名全部大寫;
由于代碼中使用了一些 Unix/Linux 系統函數的庫,是以,windows下不一定能編譯通過,可以在windows下安裝Cygwin 或者 在Windows的内置Linux子系統下進行編譯運作;
涉及内容
雖然主要的源檔案 fhttp.c 隻有400行隻有,但是内容并不少,主要包括:
- 網絡程式設計(TCP)
- 多線程
- 多程序
- 管道通訊(IPC,程序間通訊的一種方式)
- 資料的重定向
- 基礎C程式設計
應用
這樣小又簡單的Web伺服器,對于大型的Web服務當然不能支援。但是,在某些嵌入式中,由于受制于硬體限制,也許用得到,比如,很多的路由器中,還是使用cgi提供web服務來對路由器進行配置。
建議
可以在了解的大概的思路以後,自己從零開始寫一遍,而不是照抄一遍,在遇到問題時再參考代碼,這樣能夠了解得更加深刻。
存在的問題
為了代碼的簡單起見,我們隻是用了http協定字段中的很少很少一部分的内容,而且提供的是響應後立馬斷開連接配接的Http/1.0服務,是以,有時候會出現web頁面重新整理不出來情況。
如果想要大概了解一下Web伺服器的工作流程,寫完這個,就差不多能夠達到目的了!
完
作者:FoolishFlyFox
連結:https://www.jianshu.com/p/5da0938a8e54
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。