• 【Mongoose笔记】入门使用


    Mongoose笔记】入门使用

    简介

    Mongoose 笔记系列用于记录学习 Mongoose 的一些内容。

    Mongoose 是一个 C/C++ 的网络库。它为 TCP、UDP、HTTP、WebSocket、MQTT 实现了事件驱动的、非阻塞的 API。

    项目地址:

    https://github.com/cesanta/mongoose
    
    • 1

    入门使用

    下面通过参考 Mongoose 的 User Guide,学习使用 Mongoose 实现一个最小的 HTTP 服务器,使用树莓派平台进行开发,实现的步骤非常的简单。

    首先创建一个工作目录和创建main.c文件:

    pi@raspberrypi:~/Desktop $ mkdir Mongoose_test
    pi@raspberrypi:~/Desktop $ cd Mongoose_test/
    pi@raspberrypi:~/Desktop/Mongoose_test $ touch main.c
    
    • 1
    • 2
    • 3

    并将项目下载下来, 然后把项目目录中的 mongoose.cmongoose.h 这两个文件拷贝出来放入我们的工作目录中。

    pi@raspberrypi:~/Desktop/study $ git clone https://github.com/cesanta/mongoose
    正克隆到 'mongoose'...
    remote: Enumerating objects: 23694, done.
    remote: Counting objects: 100% (77/77), done.
    remote: Compressing objects: 100% (43/43), done.
    remote: Total 23694 (delta 38), reused 65 (delta 34), pack-reused 23617
    接收对象中: 100% (23694/23694), 20.30 MiB | 2.32 MiB/s, 完成.
    处理 delta 中: 100% (15043/15043), 完成.
    pi@raspberrypi:~/Desktop/study $ cd mongoose/
    pi@raspberrypi:~/Desktop/study/mongoose $ ls -l
    总用量 324
    drwxr-xr-x  3 pi pi   4096 116 17:58 docs
    drwxr-xr-x 49 pi pi   4096 116 17:58 examples
    -rw-r--r--  1 pi pi    731 116 17:58 LICENSE
    -rw-r--r--  1 pi pi   6975 116 17:58 Makefile
    drwxr-xr-x  2 pi pi   4096 116 17:58 mip
    -rw-r--r--  1 pi pi 242851 116 17:58 mongoose.c
    -rw-r--r--  1 pi pi  44797 116 17:58 mongoose.h
    -rw-r--r--  1 pi pi   4858 116 17:58 README.md
    drwxr-xr-x  2 pi pi   4096 116 17:58 src
    drwxr-xr-x  5 pi pi   4096 116 17:58 test
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    工作目录下共3个文件:

    pi@raspberrypi:~/Desktop/Mongoose_test $ ls
    main.c  mongoose.c  mongoose.h
    
    • 1
    • 2

    接下来在我们的main.c中添加一段来自Minimal HTTP server的代码,这是一个简单的 HTTP 服务器,同时提供静态和动态内容,代码如下:

    #include "mongoose.h"
    
    static void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
      if (ev == MG_EV_HTTP_MSG) {
        struct mg_http_message *hm = (struct mg_http_message *) ev_data;
        if (mg_http_match_uri(hm, "/api/hello")) {              // On /api/hello requests,
          mg_http_reply(c, 200, "", "{%Q:%d}\n", "status", 1);  // Send dynamic JSON response
        } else {                                                // For all other URIs,
          struct mg_http_serve_opts opts = {.root_dir = "."};   // Serve files
          mg_http_serve_dir(c, hm, &opts);                      // From root_dir
        }
      }
    }
    
    int main(int argc, char *argv[]) {
      struct mg_mgr mgr;
      mg_mgr_init(&mgr);                                      // Init manager
      mg_http_listen(&mgr, "http://0.0.0.0:8000", fn, &mgr);  // Setup listener
      for (;;) mg_mgr_poll(&mgr, 1000);                       // Event loop
      mg_mgr_free(&mgr);                                      // Cleanup
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    编译程序:

    pi@raspberrypi:~/Desktop/Mongoose_test $ cc -o httpserver main.c mongoose.c
    
    • 1

    运行程序:

    pi@raspberrypi:~/Desktop/Mongoose_test $ ./httpserver 
    
    • 1

    这个时候 HTTP 服务器已经运行起来了。

    打开浏览器,输入http://0.0.0.0:8000/,看到的是我们的工作目录:

    静态资源

    可以点开查看文件内容,比如查看main.c的内容:

    main

    接下来查看下动态内容,输入http://0.0.0.0:8000/api/hello,看到结果如下:

    动态资源

    或者也可以使用 curl 来访问我们的 http 服务器:

    pi@raspberrypi:~/Desktop $ curl http://0.0.0.0:8000/api/hello
    {"status":1}
    
    • 1
    • 2

    【参考资料】

    user-guide

    Minimal HTTP server


    本文链接:https://blog.csdn.net/u012028275/article/details/127719085

  • 相关阅读:
    Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs笔记
    Linux TCP 通信并发
    .NET 8上进行PDF合并
    交换机与路由器技术-33-静态NAT
    【Spark NLP】第 11 章:词嵌入
    【Bitburner】Factions
    AOP原理分析《二》- 如何开启AOP功能
    Spring boot环境搭建
    janus videoroom之媒体录制
    Android studio Mac 快捷键对应截图
  • 原文地址:https://blog.csdn.net/u012028275/article/details/127719085