Mongoose源码剖析:Introduction and Installation

简介:

引言

要剖析Mongoose的源码,首先你得知道它的一些基本情况和特性、并去使用它。本文就是介绍Mongoose是个什么东西?及如何安装和使用?这里假设你知道什么web服务器软件、web服务器使用什么协议、怎么提供服务等,如果你还不知道建议首先阅读:《Mongoose源码剖析:外篇之web服务器》。

本文主要内容如下:

  • 1、Mongoose介绍
  • 2、Mongoose的编译和使用
  • 3、Makefile的简单分析
  • 4、如何将Mongoose嵌入到应用程序中

1、Mongoose介绍

Mongoose开源项目的主页是http://code.google.com/p/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)

2、Mongoose的编译和使用

关 于Mongoose上面应该已经介绍了它的主要特性。所谓耳听为虚,眼见为实,不过现在这个时代眼见也未必为实,正所谓实践见真知,下面还是来亲身体验 下。Windows版本的Mongoose安装和使用,我就不介绍了,众所周知Windows下面的软件的安装基本都是傻瓜式的。下面我介绍的是 linux下mongoose的编译和使用(我使用的linux是Ubuntu 10.04)。

首先去主页上面下载Mongoose的源码(mongoose-2.8.tgz )。将其解压可以看到如下的文件列表:

image_thumb1

图1、mongoose源码的文件列表

其 实我们主要用到的就是mongoose.h/c文件,像main.c文件只是用来测试用的。如果你想将mongoose嵌入到你的项目中,主需要用到 mongoose.h/c就ok了!而且以后主要的剖析工作就是放在mongoose.h/c上。其中的Makefile文件是用于编译,生成可执行文件 和库文件等。

用make linux命令就可以将源码编译为linux版本的mongoose,如下图所示:

image_thumb4

图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/来访问),如下图所示:

image_thumb6

图3、访问mongoose开启的web服务

我们查看mongoose打出来的log,如下图:

image_thumb10

图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),即编译时的选项为:
image_thumb13

其中$(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编写的,因此可以非常 简单的将它嵌入到你的应用程序中。

  • 首先,拷贝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很简单呢!是的就是这么简单。


相关文章
构建 Rack-based 框架 (Rails/Grape/Sinatra) 的几个 Tricks
构建 Rack-based 框架 (Rails/Grape/Sinatra) 的几个 Tricks
|
算法
G2O (General Graph Optimization)入门及简单使用
G2O (General Graph Optimization)入门及简单使用
471 0
G2O (General Graph Optimization)入门及简单使用
|
API Ruby
生成和定制Rails生成器和模板 Creating and Customizing Rails Generators & Templates
生成和定制Rails生成器和模板 Creating and Customizing Rails Generators & Templates
133 0
|
开发工具 git Ruby
生成和定制Rails生成器和模板 Creating and Customizing Rails Generators & Templates2
生成和定制Rails生成器和模板 Creating and Customizing Rails Generators & Templates
98 0
|
JavaScript
vue cli3.0创项目报错‘This may cause things to work incorrectly. Make sure to use the same version for b’
vue cli3.0创项目报错‘This may cause things to work incorrectly. Make sure to use the same version for b’
vue cli3.0创项目报错‘This may cause things to work incorrectly. Make sure to use the same version for b’