Mongoose 框架初学使用记录
嘛....
注意:这里是使用mongoose实现HTTP服务,非数据库使用。
最近由于需要使用HTTP服务端,原先是使用的Qt框架实现的HTTP服务端,然后发现有些缺陷导致我不得不放弃这个框架,也不是完全放弃,只是HTTP服务端这里不再使用Qt,用Qt做高并发真的有点不好。
然后毅然的选择了mongoose这个框架,主要是听说这玩意 嵌入到代码中非常方便。下载之后发现果然就一个 h文件和cpp文件。。
于是开始研究这个框架,根据mongoose 用户手册再加上一堆实例教程,基本上写了一个类 进行操作封装(并不是完全的封装了)
MoHttp.h文件
主要是实现mongoose框架的基本 变量获取。注意里面有重载,主要是为了方便使用。
#define _MOHTTP_H
#ifdef _MOHTTP_H #include "mongoose.h"
#include <iostream> using namespace std; const int CHAR_HTTP_VAR_MAX = ;
const int CHAR_HTTP_COOKIE_MAX = ; class MoHttp
{
private:
struct http_message *hm = NULL; public:
MoHttp(struct http_message *);
~MoHttp();
int getGetVar(const char*, char*) const; //获取变量
void getGetVar(const char*, string &) const; //获取变量
int getPostVar(const char*, char*) const; //获取变量
void getPostVar(const char*, string &) const; //获取变量
int getCookie(const char*, char*) const; //获取Cookie
void getCookie(const char*, string &) const; //获取Cookie
int Model() const; //判断当前模式 POST/GET 1为 GET 否则为0
}; #endif
MoHttp.cpp
实现各类方法。
#include "MoHttp.h" MoHttp::MoHttp(struct http_message * hm = NULL)
{
this->hm = hm;
} int MoHttp::getGetVar(const char* name, char* var) const
{
memset(var, '\0', sizeof(var));
if (hm == NULL || name == NULL || hm->query_string.p == NULL)return -;
return mg_get_http_var(&hm->query_string, name, var, sizeof(var)); //获取变量
} void MoHttp::getGetVar(const char* name, string & str) const
{
str = "";
char var[CHAR_HTTP_VAR_MAX];
var[] = '\0';
if (hm == NULL || name == NULL || hm->query_string.p == NULL)return;
mg_get_http_var(&hm->query_string, name, var, sizeof(var)); //获取变量
if (var[] == '\0'){
return;
}
str = var; //如果数据正确
} int MoHttp::getPostVar(const char* name, char* var) const
{
memset(var,'\0',sizeof(var));
if (hm == NULL || name == NULL || hm->body.p == NULL)return -;
return mg_get_http_var(&hm->body, name, var, sizeof(var)); //获取变量
} void MoHttp::getPostVar(const char* name, string & str) const
{
str = "";
char var[CHAR_HTTP_VAR_MAX];
var[] = '\0';
if (hm == NULL || name == NULL || hm->query_string.p == NULL)return;
mg_get_http_var(&hm->body, name, var, sizeof(var)); //获取变量
if (var[] == '\0'){
return;
}
str = var; //如果数据正确
} int MoHttp::Model() const
{ if (hm == NULL || hm->method.p == NULL)return -; //数据错误
if (mg_vcmp(&hm->method, "POST") != )return ;
return ; }
int MoHttp::getCookie(const char * name, char * var) const
{
memset(var, '\0', sizeof(var));
//mg_printf(nc, "Set-Cookie: %s=%s; path=/\r\n", "wwe", "123456789"); 发送Cookie
if (hm == NULL) return -;
struct mg_str *cookie_header = mg_get_http_header(hm, "cookie"); //获取Cookie 整条
if (cookie_header == NULL) return -; //<0
return mg_http_parse_header(cookie_header, name, var, sizeof(var));
} void MoHttp::getCookie(const char* name, string & str) const
{
str = "";
char var[CHAR_HTTP_COOKIE_MAX]; //Cookie 最大更长
var[] = '\0';
if (hm == NULL || name == NULL || hm->query_string.p == NULL)return;
struct mg_str *cookie_header = mg_get_http_header(hm, "cookie"); //获取Cookie 整条
if (cookie_header == NULL) return;
mg_http_parse_header(cookie_header, name, var, sizeof(var));
if (var[] == '\0'){
return;
}
str = var; //如果数据正确
} MoHttp::~MoHttp()
{ }
使用方法:
Mo.cpp(或Main.cpp)
// Copyright (c) 2016 by Suwings
// All rights reserved #include <iostream>
#include "MoHttp.h" using namespace std; static char *s_http_port = "";
static struct mg_serve_http_opts s_http_server_opts; MoHttp * mo = NULL; static void ev_handler(struct mg_connection *nc, int ev, void *p) {
if (ev == MG_EV_HTTP_REQUEST) { //如果是HTTP 请求
struct http_message *hm = (struct http_message *) p; //传为
mo = new MoHttp(hm); //记得释放内存,实例化 MoHttp
if (mo->Model()==){
//GET
string w; //测试代码
mo->getGetVar("user",w); //测试代码
if (w != "")cout << "变量:" << w.c_str() << endl; //测试代码 }else{ //测试代码
//POST
} //测试代码
delete mo; //释放变量
mg_serve_http(nc, hm, s_http_server_opts); //数据发送
}
} int main(void) {
struct mg_mgr mgr;
struct mg_connection *nc;
//struct mg_request_info *ww;
mg_mgr_init(&mgr, NULL);
printf("[状态] 服务器已经开启在端口: %s\n", s_http_port); nc = mg_bind(&mgr, s_http_port, ev_handler);
if (nc == NULL) {
printf("Failed to create listener\n");
return ;
} // Set up HTTP server parameters
mg_set_protocol_http_websocket(nc);
s_http_server_opts.document_root = "./www/"; // Serve current directory
s_http_server_opts.enable_directory_listing = "no"; //Set if show dir
for (;;) {
mg_mgr_poll(&mgr, );
}
mg_mgr_free(&mgr); return ;
}
看了几个小时之后,差不多只能写出这么点东西了。然后我就一直在想。
但是你有没有发现,如果浏览器要是发送 Ajax 数据过来,假定逻辑在 C++ 代码里面,我应该如何设置返回的数据啊?
的确,这个类也没有加入 返回的数据,这个问题我也一直在困扰。
难道mongoose 框架都没有函数是可以设置数据在 body 的?百思不得其解的我于是去找了一下 mongoose 文档里面的例子,发现了一个Cookie验证的例子,原本我以为不管怎么样也会有设置数据的地方了,但是我惊奇的发现,是这样的:
Cookie_auth.c 例子文件
static void set_session_cookie(struct mg_connection *nc,
const struct session *s) {
mg_printf(nc, "Set-Cookie: %s=%" INT64_X_FMT "; path=/\r\n",
SESSION_COOKIE_NAME, s->id);
} /*
* If requested via GET, serves the login page.
* If requested via POST (form submission), checks password and logs user in.
*/
static void login_handler(struct mg_connection *nc, int ev, void *p) { //主要看这个函数
struct http_message *hm = (struct http_message *) p;
if (mg_vcmp(&hm->method, "POST") != ) {
/* Serve login.html */
mg_serve_http(nc, (struct http_message *) p, s_http_server_opts);
} else {
/* Perform password check. */
char user[], pass[];
int ul = mg_get_http_var(&hm->body, "user", user, sizeof(user));
int pl = mg_get_http_var(&hm->body, "pass", pass, sizeof(pass));
if (ul > && pl > ) { //如果有数据
if (check_pass(user, pass)) { //验证账号和密码 函数无须理会
struct session *s = create_session(user, hm); //mg_printf 是直接输出数据,并不是输出到body
mg_printf(nc, "HTTP/1.0 302 Found\r\n");
set_session_cookie(nc, s); //他是进行了一次跳转,并且直接返回的HTTP头
mg_printf(nc, "Location: /\r\n");
mg_printf(nc, "\r\nHello, %s!\r\n", s->user);
//这句是控制台输出
fprintf(stderr, "%s logged in, sid %" INT64_X_FMT "\n", s->user, s->id);
} else {
mg_printf(nc, "HTTP/1.0 403 Unauthorized\r\n\r\nWrong password.\r\n");
}
} else {
mg_printf(nc, "HTTP/1.0 400 Bad Request\r\n\r\nuser, pass required.\r\n");
}
nc->flags |= MG_F_SEND_AND_CLOSE;
}
(void) ev;
}
看完了之后我就跟纳闷了,为什么要直接输出HTTP头?框架难道真的没有提供类似的方法吗?
然后尝试了各类函数:
也无果,这些函数会 输出到 HTTP 响应头之前。

所以,是不是这个框架真的没有 什么设置返回的body 的函数呢?
总之目前只学到这里,也许有什么地方确实没有了解。暂且先记录下来,等知道了之后再续写。
Mongoose 框架初学使用记录的更多相关文章
- ABP框架踩坑记录
ABP框架踩坑记录 ASP.NET Boilerplate是一个专用于现代Web应用程序的通用应用程序框架. 它使用了你已经熟悉的工具,并根据它们实现最佳实践. 文章目录 使用MySQL 配置User ...
- 过滤掉Abp框架不需要记录的日志
该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇. 问题 ABP.WindowsService/Demo.MyJob/4.0.0该项目不仅 ...
- 大幅度改变celery日志外观,修改成日志可点击跳转和鲜艳五彩日志,解决脚本中已添加handler的logger和框架日志重复记录问题。
大幅度改变celery日志外观,修改成日志可点击跳转和鲜艳五彩日志,解决脚本中已添加handler的logger和框架日志重复记录问题.打猴子补丁. 先把脚本中的所有logger的handlers全部 ...
- Laravel框架初学一路由(基本路由)
基本路由 Laravel最基本的路由:接收一个URI和Closure闭包函数 ,提供了定义路由的一种非常简单且富有表达力的方式 Route::get("foo", function ...
- Android 项目框架功能整理记录
用来记录自己在项目用到的框架工具等,新人新记录,希望能对你搭建项目有所帮助 常用框架整理 视图绑定注解框架: butterKnife 网络请求框架: OKHttp 图片加载缓存:Gilde 数据格式解 ...
- EFW框架源代码版本升级记录说明
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...
- EF框架 完整项目记录
今天终于能用EF框架搭建一个项目,同时能连接sqlserver 数据库.mysql 数据库 1.必须的文件 2.将必须文件导入项目,此处用到“管理 NuGet 程序包”,由于从网上下载比较慢,此处从本 ...
- DWZ前端框架使用问题记录
心得体验:DWZ依赖特定的HTML结构,所以一定要注意项目中的HTML结构,多用firebug查看,还有如果使用一些组件的时候出现问题,可以查看下返回JSON格式是否符合组件规定的JSON格式,很多都 ...
- 集合框架-Map练习-记录字母出现的次数
/* * 练习: * 字符串"abcb453 sddbs343bsjvAJBBDVBs21768723",获取该字符串中,每一个字母出现的次数. * 要求打印结果是:a(2)b ...
随机推荐
- [原创]自定义BaseAcitivity的实现,统一activity的UI风格样式
在开发过程中经常遇到多个activity是同一种样式类型的情况,如果分别对其进行UI的布局,不但比较繁琐,而且后续维护过程人力成本很高,不利于敏捷开发.解决的方案是采用抽象后的BaseActi ...
- Mac安装win7
为了给老板的mac air装上win7,研究了大致4-5小时,终于搞定! 新版的air安装实在是太不容易了,现在记录如下: 制作硬件:8G优盘一个(至少大于6G空白优盘一个),Macbook ai ...
- 架构模式之REST架构
直至今日,分布式系统(Distributed System)已经取得了大规模的应用,特别是Web的发展,已经给软件开发带来了翻天覆地的变化,这一点已经毋庸置疑了. 构建分布式系统常用的技术通常就是使用 ...
- mem_fun 例子
// functional_mem_fun.cpp // compile with: /EHsc #include <vector> #include <functional> ...
- ASP.NET 如何发现问题的方法
1.打开IntelliTrace,查看遇到的问题: 2.打开IE8以上,按F12,启动js调试,查看遇到的错误:
- 三十一、【WCF路由中间件】WCFHosting服务主机的路由器与负载均衡和实现思路
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://pan.baid ...
- Mount NAS Storage in Linux Overview 转载
Mount NAS Storage in Linux Overview Mounting your NAS Storage to a device that runs on a Linux-based ...
- 2016 SDCC会后总结
很荣幸作为前端专题讲师参加2016年SDCC,与周爱民老师同台,听业界牛人的分享真是受益匪浅.对我来说是第一次在如此规模的专题论坛上演讲,全程紧张的要命,提前准备好的内容有很多因为紧张没有讲出来.此次 ...
- uboot命令及内核启动参数
修改:mw [内存地址] [值] [长度] 例如:mw 0x02000000 0 128 表示修改地址为0x02000000~0x02000000+128的内存值为0. 显示:md [内存地址 ...
- Exchange Server简介与搭建
一.Exchange Server简介Exchange Server 是微软公司的一套电子邮件服务组件,是个消息与协作系统. 简单而言,Exchange server可以被用来构架应用于企业.学校的邮 ...