网站首页 > 文章精选 正文
什么是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
- 上一篇: 2023年值得推荐的 API 开发工具
- 下一篇: C 语言源程序文件扩展名及相关知识详解
猜你喜欢
- 2025-05-27 2023年值得推荐的 API 开发工具
- 2025-05-27 FastAPI 鉴权解析:实现身份验证与权限控制的关键步骤
- 2025-05-27 Spring Boot 常用注解大全:每个程序员必备
- 2025-05-27 Spring服务端框架中SSE的使用实践
- 2025-05-27 GraphQL的简单应用
- 2025-05-27 一招搞定外部请求,这款 HTTP 客户端框架真的很强大!
- 2025-05-27 为什么我们需要授权和认证?
- 2025-05-27 Node.js 是什么?Node.js 简介及安装配置详解指南!
- 2025-05-27 Axios 的 put 请求解析:实现前后端数据通信的关键步骤
- 2025-05-27 K8s Ingress 解决 “长连接” 负载不均衡的问题
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)