天天看點

自己動手寫http伺服器(三) -- 代碼實作

系列文章:

自己動手寫http伺服器(一) -- UNIX C 網絡程式設計

自己動手寫http伺服器(二) -- http協定分析

自己動手寫http伺服器(三) -- 代碼實作

有了前兩篇的描述,我們就能實作一個簡單的web伺服器了。

效果

先來介紹一下最終的效果:

我們通過編譯生成兩個可執行檔案: fhttpd 和 login.cgi,其中,fhttpd 是我們的web伺服器軟體,而 login.cgi 是用C語言編寫的可執行檔案,用于動态生成web頁面;

開啟伺服器并通路的過程如下:

1、啟動伺服器

通過指令

./fhttpd 端口号

指定在本機開啟的web服務端口,并啟動服務,如:

自己動手寫http伺服器(三) -- 代碼實作

啟動web服務

我們就開啟了web服務,開啟的端口為 8888 ;

伺服器通路

在浏覽器中輸入 :

localhost:8888

就可通路啟動的伺服器:

自己動手寫http伺服器(三) -- 代碼實作

通路Web服務

登陸

通過輸入使用者名和密碼,伺服器會校驗使用者是否存在,分為3種情況:

1、使用者名不存在

例如,輸入使用者名:foolish ,密碼:abc,web伺服器發現找不到該使用者名,則顯示如下:

自己動手寫http伺服器(三) -- 代碼實作

使用者不存在

2、密碼不正确

例如,輸入使用者名:admin ,密碼:abc,顯示如下:

自己動手寫http伺服器(三) -- 代碼實作

密碼錯誤

3、成功登入

例如:輸入使用者名:admin ,密碼:123456,顯示如下:

自己動手寫http伺服器(三) -- 代碼實作

成功登入

源碼

源碼可以下載下傳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

來源:簡書

簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。