使用Mongoose创建webserver

科技一点鑫得 2024-03-10 00:09:14
什么是Mongoose?

Mongoose是一个c/c++的开源网络库,它支持TCP、UDP、HTTP、WebSocket、MQTT协议,API实现基于事件驱动、非阻塞的方式。Mongoose是非常轻量级的库,具有非常好的跨平台特性,特别是在嵌入式领域支持非常多的嵌入式架构。从官网介绍来看,无论是开源项目还是商业项目都有大量的应用,甚至国际空间站都运行着Mongoose。Mongoose可以让嵌入式网络编程很快速、很健壮且很容易。

本文演示如何在windows下使用Mongoose开发一个简单的web server,意在使首次接触Mongoose的同学可以快速上手,之后就可以通过官方文档更深入地学习。

下载mongoose

Mongoose代码托管在github[下载链接:https://github.com/cesanta/mongoose/releases],这里下载最新发布版本7.9,windows系统下载zip包。

解压之后只需要使用mongoose.h和mongoose.c两个文件

创建c++控制台项目

使用visual studio创建一个c++控制台项目,将下载的mongoose.h和mongoose.c也复制到项目目录中。

使用平台工具集为v143、Windows SDK版本为10.0

头文件和源文件分别添加现有项,将mongoose.h和mongoose.c添加到项目中。

开发一个简单的web server

Mongoose是事件驱动的api,它的处理机制和Windows消息循环机制类似,mg_mgr_poll方法负责处理所有连接的请求、收发数据及关闭连接,并调用相应的事件处理函数进行响应处理,开发者重点要写的就是事件处理函数。Mongoose有两个基本的结构体:

struct mg_mgr 事件管理器,管理所有激活的连接struct mg_connection 单个连接描述结构

下面的示例代码创建了一个web server,事件处理函数fn中实现了三个简单的能力,一个显示根目录文件列表、一个显示hello Mongoose的html页面、一个简单的post请求计算两个数之和。

#include <iostream>#include "mongoose.h"static void fn(struct mg_connection* c, int ev, void* ev_data, void* fn_data) { //MG_EV_HTTP_MSG表示为http请求 if (ev == MG_EV_HTTP_MSG) { struct mg_http_message* hm = (struct mg_http_message*)ev_data; //get请求示例,显示Hello Mongoose页面 if (mg_http_match_uri(hm, "/hello")) { mg_http_reply(c, 200, "", "<html><head><title>mongoose demo</title></head><body><h1>Hello Mongoose!</h1></body></html>\n"); } //post请求示例,请求体json示例{"a":10,"b":20},计算a+b的值 else if (mg_http_match_uri(hm, "/api/sum")) { double a = 0; double b = 0; mg_json_get_num(hm->body, "$.a", &a); mg_json_get_num(hm->body, "$.b", &b); double sum = a + b; mg_http_reply(c, 200, "Content-Type: application/json\r\n", "{\"result\":%lf}", sum); } //显示当前目录文件列表 else { struct mg_http_serve_opts opts = { 0 }; opts.root_dir = "."; mg_http_serve_dir(c, hm, &opts); } }}int main(){ //创建事件管理器 struct mg_mgr mgr; //设置日志级别为DEBUG,如果不做设置,默认情况下运行程序控制台不打印任何请求响应消息 mg_log_set(MG_LL_DEBUG); //初始化事件管理器 mg_mgr_init(&mgr); //创建http监听 mg_http_listen(&mgr, "http://127.0.0.1:8080", fn, NULL); //开启事件循环 for (;;) { // 1000ms为超时时长 mg_mgr_poll(&mgr, 1000); } mg_mgr_free(&mgr); return 0;}测试你的web server

代码编译通过后运行程序将打开控制台并启用web server,打印信息显示web服务端口为8080

浏览器访问http://127.0.0.1:8080将显示exe程序根目录文件列表

浏览器访问http://127.0.0.1:8080/hello将显示Hello Mongoose

使用postman或apifox,发送post请求http://127.0.0.1:8080/api/sum,请求json参数为{"a": 100, "b": 2},响应结果也为json,其中result为a+b的结果。

参考文献

[1] Mongoose - an embedded Web Server, MQTT and Websocket library

0 阅读:0

科技一点鑫得

简介:感谢大家的关注