天天看點

Mongoose源碼剖析:Introduction and Installation

本文主要内容如下:

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)。

Mongoose源碼剖析:Introduction and Installation

圖1、mongoose源碼的檔案清單

實我們主要用到的就是mongoose.h/c檔案,像main.c檔案隻是用來測試用的。如果你想将mongoose嵌入到你的項目中,主需要用到

mongoose.h/c就ok了!而且以後主要的剖析工作就是放在mongoose.h/c上。其中的makefile檔案是用于編譯,生成可執行檔案

和庫檔案等。

用make linux指令就可以将源碼編譯為linux版本的mongoose,如下圖所示:

Mongoose源碼剖析:Introduction and Installation

圖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

Mongoose源碼剖析:Introduction and Installation

圖3、通路mongoose開啟的web服務

我們檢視mongoose打出來的log,如下圖:

Mongoose源碼剖析:Introduction and Installation

圖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),即編譯時的選項為:

Mongoose源碼剖析:Introduction and Installation

其中$(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很簡單呢!是的就是這麼簡單。

下一篇: VTK:前言