Mongoose源碼剖析:Introduction and Installation

引言

要剖析Mongoose的源碼,首先你得知道它的一些基本情況和特性、並去使用它。本文就是介紹Mongoose是個什麼東西?及如何安裝和使用?這裏假設你知道什麼web服務器軟件、web服務器使用什麼協議、怎麼提供服務等,如果你還不知道建議首先閱讀:《Mongoose源碼剖析:外篇之web服務器》。

本文主要內容如下:

  1. I、Mongoose介紹
  2. II、Mongoose的編譯和使用
  3. III、Makefile的簡單分析
  4. IV、如何將Mongoose嵌入到應用程序中

1、Mongoose介紹

Mongoose開源項目的主頁是http://code.google.com/p/mongoose/。Mongoose是一個web服務器,通過提供一個web接口給它,它可以嵌入到現有的應用程序中去。Mongoose web服務器的執行是自滿足的,它不依賴於任何其他服務。如果你將它複製到任何目錄並執行,它將將啓動web服務並將當前目錄作爲主目錄、端口號是8080。當然這些配置選項都可以通過配置文件mongoose.conf設置。

Mongoose它的前身是shttpd,它完全開源和自由使用。它還具有如下特性:

  1. 跨平臺——Windows、MacOS 、 大多數UNIX
  2. CGI, SSL, SSI, Digest (MD5) authorization, resumed download, aliases
  3. IP-based ACL, Windows service, GET, POST, HEAD, PUT, DELETE methods
  4. Small footprint: executable size is 40 kB on Linux 2.6 i386 system, 60 kB on Windows system
  5. 能夠用簡單和乾淨的API嵌入到應用程序中
  6. Language suport for:
    1. C/C++ (native)
    2. Python - since version 2.6 (done)
    3. C# - since version 2.7 (done)
    4. Ruby - since version 2.9 (todo)
    5. Lua - since version 2.9 (todo)

2、Mongoose的編譯和使用

關於Mongoose上面應該已經介紹了它的主要特性。所謂耳聽爲虛,眼見爲實,不過現在這個時代眼見也未必爲實,正所謂實踐見真知,下面還是來親身體驗下。Windows版本的Mongoose安裝和使用,我就不介紹了,衆所周知Windows下面的軟件的安裝基本都是傻瓜式的。下面我介紹的是linux下mongoose的編譯和使用(我使用的linux是Ubuntu 10.04)。

首先去主頁上面下載Mongoose的源碼(mongoose-2.8.tgz )。將其解壓可以看到如下的文件列表:

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 server,當前工作目錄是/home/netsky/Downsloads/mongoose,端口號是8080。我們可以在瀏覽器中輸入http://localhost:8080/來訪問web服務器(或者如果你跟我一樣是在Ubuntu是運行在虛擬機中,你可以在外面的Windows系統中用瀏覽通過http://linux的ip:8080/來訪問),如下圖所示:

Mongoose源碼剖析:Introduction and Installation

圖3、訪問mongoose開啓的web服務

我們查看mongoose打出來的log,如下圖:

Mongoose源碼剖析:Introduction and Installation

圖4、mongoose打印的log

 從log可以看出有兩個client,一個是我剛纔在linux裏面通過瀏覽器打開web服務的根目錄;另一個是我在Windows下面通過瀏覽器打開web服務的根目錄。

3、Makefile的簡單分析

下面我們簡單分析一下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文的後半部分。)

4、如何將Mongoose嵌入到應用程序中

目前Mongoose可以支持嵌入到C/C++、Python、C#,而且在下一個版本(2.9)將支持Ruby、Lua。但在這裏我只介紹怎麼樣將Mongoose嵌入到C/C++中。其實將Mongoose嵌入到C/C++應用程序中很簡單,因爲Mongoose本來就是用C編寫的,因此可以非常簡單的將它嵌入到你的應用程序中。

  1. 首先,拷貝mongoose.h/c到你的源碼目錄下
  2. 然後,在你的應用程序中啓動和配置mongoose。其實自帶的main.c就是一個很好的例子,當我們編mongoose的可執行文件時就用到了它。你完全可以把main.c當做你的應用程序,完全一樣,當然業務邏輯不同。(後面假設你的應用程序名爲main.c,當然怎麼命名隨你喜歡!)
  3. 最後,跟上面我們分析的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很簡單呢!是的就是這麼簡單。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章