本文主要内容如下:
1、mongoose介紹
2、mongoose的編譯和使用
3、makefile的簡單分析
4、如何将mongoose嵌入到應用程式中
mongoose是一個web伺服器,通過提供一個web接口給它,它可以嵌入到現有的應用程式中去。mongoose
web伺服器的執行是自滿足的,它不依賴于任何其他服務。如果你将它複制到任何目錄并執行,它将将啟動web服務并将目前目錄作為主目錄、端口号是
8080。當然這些配置選項都可以通過配置檔案mongoose.conf設定。
mongoose它的前身是shttpd,它完全開源和自由使用。它還具有如下特性:
跨平台——windows、macos 、 大多數unix
cgi, ssl, ssi, digest (md5) authorization, resumed download, aliases
ip-based acl, windows service, get, post, head, put, delete methods
small footprint: executable size is 40 kb on linux 2.6 i386 system, 60 kb on windows system
能夠用簡單和幹淨的api嵌入到應用程式中
language suport for:
c/c++ (native)
python - since version 2.6 (done)
c# - since version 2.7 (done)
ruby - since version 2.9 (todo)
lua - since version 2.9 (todo)
關
于mongoose上面應該已經介紹了它的主要特性。所謂耳聽為虛,眼見為實,不過現在這個時代眼見也未必為實,正所謂實踐見真知,下面還是來親身體驗
下。windows版本的mongoose安裝和使用,我就不介紹了,衆所周知windows下面的軟體的安裝基本都是傻瓜式的。下面我介紹的是
linux下mongoose的編譯和使用(我使用的linux是ubuntu 10.04)。
圖1、mongoose源碼的檔案清單
其
實我們主要用到的就是mongoose.h/c檔案,像main.c檔案隻是用來測試用的。如果你想将mongoose嵌入到你的項目中,主需要用到
mongoose.h/c就ok了!而且以後主要的剖析工作就是放在mongoose.h/c上。其中的makefile檔案是用于編譯,生成可執行檔案
和庫檔案等。
用make linux指令就可以将源碼編譯為linux版本的mongoose,如下圖所示:
圖2、linux下面mongoose的編譯和執行
如
上圖,當我們輸入make指令的時候,會提示你帶相應環境的參數make
(linux|bsd|solaris|mac|windows|mingw),這裡我們選擇linux。編譯完之後,生成了兩個檔案:一個可執行檔案
mongoose、一個庫檔案_mongoose.so。你可以直接将_mongoose.so庫檔案拿到你的項目中去使用(當然是基于linux環境的
項目,如果在windows環境下是編譯出相應的dll檔案,去直接使用)。
從上圖可以看出,編譯完之後我
們運作了(./mongoose),看到mongoose 2.8 started on port(s) [8080], serving
directory [/home/netsky/downloads/mongoose]。即現在就啟動了web
圖3、通路mongoose開啟的web服務
我們檢視mongoose打出來的log,如下圖:
圖4、mongoose列印的log
從log可以看出有兩個client,一個是我剛才在linux裡面通過浏覽器打開web服務的根目錄;另一個是我在windows下面通過浏覽器打開web服務的根目錄。
下面我們簡單分析一下makefile檔案,看我們執行make linux的時候,編譯了什麼源檔案,及編譯的一些選項。
從prog= mongoose和lib= _$(prog).so可以知道編譯生成的執行檔案名和庫的名字;
從linux:
$(cc) $(linflags) mongoose.c -shared -fpic -fpic -s -o $(lib)
$(cc) $(linflags) mongoose.c main.c -s -o $(prog)
我們知道,在linux下面編譯用到了哪些源檔案:編譯庫檔案_mongoose.so時僅用到了mongoose.c檔案,編譯可執行檔案時除了mongoose.c檔案還用到了main.c。注意上面的變量$(linflags),即編譯時的選項為:
其中$(copt)選項是我們make的時候跟的一些選項,下面列出這些選項及其意義:
all:
@echo "make (linux|bsd|solaris|mac|windows|mingw)"
# possible copt values: (in brackets are rough numbers for 'gcc -o2' on i386)
# -dhave_md5 - use system md5 library (-2kb)
# -dndebug - strip off all debug code (-5kb)
# -ddebug - build debug version (very noisy) (+7kb)
# -dno_cgi - disable cgi support (-5kb)
# -dno_ssl - disable ssl functionality (-2kb)
# -dconfig_file=\"file\" - use `file' as the default config file
# -dno_ssi - disable ssi support (-4kb)
# -dhave_strtoui64 - use system strtoui64() function for strtoull()
makefile就簡單的分析到這了,現在應該比較清楚可執行檔案及庫是怎麼生成的了。(提示:windows下面的編譯,makefile檔案中也已經給出了,請檢視makefile文的後半部分。)
目
前mongoose可以支援嵌入到c/c++、python、c#,而且在下一個版本(2.9)将支援ruby、lua。但在這裡我隻介紹怎麼樣将
mongoose嵌入到c/c++中。其實将mongoose嵌入到c/c++應用程式中很簡單,因為mongoose本來就是用c編寫的,是以可以非常
簡單的将它嵌入到你的應用程式中。
首先,拷貝mongoose.h/c到你的源碼目錄下
然
後,在你的應用程式中啟動和配置mongoose。其實自帶的main.c就是一個很好的例子,當我們編mongoose的可執行檔案時就用到了它。你完
全可以把main.c當做你的應用程式,完全一樣,當然業務邏輯不同。(後面假設你的應用程式名為main.c,當然怎麼命名随你喜歡!)
最後,跟上面我們分析的makefile中介紹到的如何在linux下編譯mongoose一樣,你也是用下面的指令編譯:
cc main.c mongoose.c –ldl -lpthread –o test
關于編譯選項-pthread:mongoose中在程式中用到了pthread.h頭檔案中的函數時需要加這個選項。在編譯的時候加上此選項會去連結libpthread.a或libpthread.so檔案。
關于如何編寫類似main.c代碼調用mongoose提供的接口,這個工作在本系列後面的文章中介紹。
至此,将mongoose嵌入到你的c/c++應用程式中的工作已經完成,現在你執行./test即可以應用你的應用程式,它調用到了mongoose提供的一些接口。
通常上面的介紹,是不是覺得在應用程式嵌入mongoose很簡單呢!是的就是這麼簡單。