假装异步加载中...
25 Dec 2013

小型web服务器Mongoose试用

缘由

早先PC端有几个服务器由于需求牵扯到了一些HTTP请求,当时使用了Mongoose,当时没怎么接触,前段时间客户端做加速器又准备使用个小型web server,选定的也是这个,处于兴趣,前N个星期六抽了半天看了下相关文档,记录下(我承认我TM懒)。

简介

Mongoose是一个非常小巧的web服务器,支持C/C++、C#、Python、Ruby、Lua语言。它实现了对Socket的封装,提供了简洁的开发接口,性能也很好,主要用在嵌入式开发平台,主页是http://cesanta.com/

Mongoose可以编译成so,或者直接上源文件(就两个文件,适合携带),主要有以下特性:

  1. 可以运行在Windows,Mac,Unix/Linux,iPhone, Android和其他平台
  2. 脚本支持Lua,数据库支持SQLite,扩展性不错(PHP也能用)
  3. 支持CGI,SSL,SSI,Digest(MD5)认证,Websocket,WebDAV
  4. 支持断点续传,URL rewrite,文件黑名单,基于IP的ACL
  5. 干净简单的API,只有mongoose.h和mongoose.c
  6. 大量的实例

实例

在监听1125端口,如果请求的是hello.html就返回这个网页,其他情况返回请求的目录,代码如下:

#include <iostream>
#include <string.h>
using namespace std;
#include "mongoose.h"

static int event_handle(struct mg_event* event)
{
  if (event->type == MG_REQUEST_BEGIN)
  {
      if (strcmp(event->request_info->uri,"/hello.html") != 0)
      {
        char content[100];

        // Prepare the message we're going to send
        int content_length = snprintf(content, sizeof(content),
                "Hello from mongoose! Requested: [%s] [%s]",
                event->request_info->request_method, event->request_info->uri);

        // Send HTTP reply to the client
         mg_printf(event->conn,
             "HTTP/1.1 200 OK\r\n"
             "Content-Type: text/plain\r\n"
             "Content-Length: %d\r\n"        // Always set Content-Length
             "\r\n"
             "%s",
            content_length, content);

         // Returning non-zero tells mongoose that our function has replied to
         return 1;
      }
  }

  return 0;
}

int main()
{
    const char* options[] = {
        "listening_ports", "1125",
        "document_root", "wwwroot",
        NULL};
    struct mg_context* ctx = mg_start(options,&event_handle,NULL);
    if (ctx == NULL)
    {
        cout << "start failed\n";
    }
    else
    {
        cout << "start success\n";
    }

    getchar();

    mg_stop(ctx);
    return 0;
}

总结

总体来说Mongoose很让人惊喜,小巧强大,使用简便,还支持URL rewrite和正则表达式,并且可以通过Lua来扩展。下载的源码中有大部分的使用示例,官方文档也很齐全。

下载:http://cesanta.com/index.html#downloads
文档:http://cesanta.com/docs.html

comments powered by Disqus