引言

要剖析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 )。将其解压可以看到如下的文件列表:

图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 server,当前工作目录是/home/netsky/Downsloads/mongoose,端口号是8080。我们可以在浏览器中输入http://localhost:8080/来访问web服务器(或者如果你跟我一样是在Ubuntu是运行在虚拟机中,你可以在外面的Windows系统中用浏览通过http://linux的ip:8080/来访问),如下图所示:

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

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

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

其中$(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很简单呢!是的就是这么简单。

Mongoose源码剖析:Introduction and Installation相关推荐

  1. Mongoose源码剖析:外篇之web服务器

    引言 在深入Mongoose源码剖析之前,我们应该清楚web服务器是什么?它提供什么服务?怎样提供服务?使用什么协议?客户端如何唯一标识web服务器的资源?下面我们抛开Mongoose,来介绍一个we ...

  2. 深入理解RCU | RCU源码剖析

    hi, 上次分析了RCU核心思想:深入理解RCU|核心原理,后面说会分享一篇RCU的源码剖析,其实我这边已经总结得差不多: 但自己思考了一下,发现大部分都是代码分析,这样很多人其实并不喜欢看源代码分析 ...

  3. 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...

    老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...

  4. JS魔法堂:mmDeferred源码剖析

    一.前言 avalon.js的影响力愈发强劲,而作为子模块之一的mmDeferred必然成为异步调用模式学习之旅的又一站呢!本文将记录我对mmDeferred的认识,若有纰漏请各位指正,谢谢.项目请见 ...

  5. Kafka源码剖析 —— 网络I/O篇 —— 浅析KafkaSelector

    为什么80%的码农都做不了架构师?>>>    ##NioSelector和KafkaSelector有什么区别? 先说结论,KafkaSelector(org.apache.kaf ...

  6. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...

    老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...

  7. 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...

    老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例 在上一节的第一个"增加日记"的示例中,我们并没有看到日记 ...

  8. STL源码剖析学习七:stack和queue

    STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...

  9. 一个完整的python项目源码-一个Python开源项目-腾讯哈勃沙箱源码剖析(上)

    前言 2019年来了,2020年还会远吗? 请把下一年的年终奖发一下,谢谢... 回顾逝去的2018年,最大的改变是从一名学生变成了一位工作者,不敢说自己多么的职业化,但是正在努力往那个方向走. 以前 ...

最新文章

  1. regex在.NET里判断输入信息的合法性
  2. 深入理解CPU的调度原理
  3. 计算机科学导论(第一次阅读)
  4. JavaScript_Util_01
  5. [转]如何处理机器学习中的不平衡类别
  6. Winform主窗体的设置
  7. 优秀的模糊测试代码是如何炼成的?
  8. Java中常见数据结构:list与map -底层如何实现
  9. winRar禁止弹窗广告方法
  10. PHP 引用在线编辑器,kindeditor
  11. Redis下载安装与配置(windows)
  12. MOEA/D原理及pyton实现
  13. 【原创】常用元器件(电阻)选型之阻值识别-cayden20220910
  14. 装完虚拟机后键盘无法使用
  15. Google Dapper,大规模分布式系统的跟踪系统
  16. qt打开xls文件_Qt中打开excel文件
  17. 基于数字证书的windows安全登录
  18. 如何查看主机IP地址
  19. 键盘控制盒子移动案例
  20. 基于粒子群优化算法的最小二乘支持向量机预测模型构建(MATLAB实现)

热门文章

  1. Kubernetes的Service
  2. Android自定义View,滑动,事件传递小结
  3. 详解MariaDB数据库的触发器
  4. DIV + CSS布局的一些知识汇总
  5. Android SurfaceView 绘图及帧频处理方法修正
  6. 【转载】并发数据结构
  7. 【mysql】--MHA+Atlas
  8. 数据库设计中的范式、关联与nosql分析【转】
  9. [转] android自动化之MonkeyRunner测试环境配置(一)
  10. ORA-00913错误:PL/SQL: ORA-00913: too many values