
Mongoose
文章平均质量分 64
Mongoose source code and example
猿来是码农
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
mongoose源码解读(二) -- mg_mgr_init 初始化
所以 user_data 指针为 nullptr, 所以mg_mgr_init_opt() 里后两个参数是都是空的。在用 mongoose 源码开发的时候,这个初始化函数 mg_mgr_init()则是必须的,我们看下它到底做了哪些初始化操作。那调用的都是上面的函数指针,如果是启用了 ssl 的可能又是另外一套函数指针接口了。而这个 mg_default_iface_vtable 就是函数指针的集合,这里用到了一个全局变量 mg_ifaces,它的定义是这样的。原创 2024-02-29 18:51:28 · 766 阅读 · 0 评论 -
HTTP 的 multipart 类型
里有一个 multipart 多部分对象集合类型,这个类型 http 指南里有讲到:MIME 中的 multipart(多部分)电子邮件报文中包含多个报文,它们合在一起作为单一的复杂报文发送。每一部分都是独立的,有各自的描述及内容的集;而在 Mongoose.c 源码里,是这样处理 multipart 类型的报文的,判断头部字段 Content-Type 为 multipart 时,交由相关处理函数进行处理,然后就 return 了,不再后续处理了。表格情形还没试验过,这里主要讲文档情形的。原创 2024-02-27 15:47:50 · 1276 阅读 · 0 评论 -
Mongoose http server 例子
今天使用的是mongoose 自带的例子,位于源码目录的 examples/http-server 下的 main.c,因为我使用了c++的,所以我自己创建了目录 myExample/http_server,把它的 main.c 换成了 main.cpp,makefile 使用自己的,在编译的时候解决一下编译问题即可。0x1f30580 + 3(method 的长度) + 1(一个空格) = 0x1f30584,0x1f30584 + 1(uri的长度)+1(一个空格) = 0x1f30586。原创 2023-08-10 15:04:27 · 1334 阅读 · 0 评论 -
mongoose 实现http web,跨域问题
1,工作中用mongoose搭建的http web 服务端,在用postman工具测试时GET、POST是正常的,但在实际开发中,跟前端同事调试时用web浏览器去GET时是正常的,POST时却显示跨域问题,如图所示:Status一栏显示CORS error即为跨域导致的错误,何为跨域这里不关心,关心的是如何解决。控制台消息:前端同事提示要在应答头里添加"Access-Control-Allow-Origin:*",但查看源码这个已经加了,还是出问题,从上面的提示看可能还需要添加"Ac原创 2021-05-27 16:24:51 · 1172 阅读 · 2 评论 -
mongoose搭建web服务(一)
最近工作当中遇到了mongoose,主要是用它作为web服务器,在嵌入式设备上使用,用于pc web客户端与设备端数据交互。这里不介绍mongoose本身,只记录编译mongoose过程中遇到的问题,及使用实例,测试使用的是postman工具。1,源码下载与编译源码在github上也有,这是我自己的上传的源码,在编译过程遇到的问题:原因为没有链接ssl为,编译选项添加:-lssl添加链接库:-lcrypto2,实例这里将mongoose编译成了so动态库,与实例一起编译和原创 2021-05-08 11:56:19 · 3145 阅读 · 0 评论 -
mongoose搭建web服务(二)
在上一篇文章中已经实现web服务,可以实现简单的http通信,但实现的功能还是单一的,即只实现了一个统一的入口,在实际项目中实现需要更加详细和复杂,如:api 接口分类,类似/api/network/xxx 的请求则由network类进行处理,即通过/api/xxx查找对应的类xxx进行处理,而对应的处理类下又可以分很多方法,每个方法处理不同的事务,这样可以达到处理模块清晰可见,维护起来更方便。1,抽象类,实现保存路由与对象映射表#ifndef __ICONTROLLER_H__#.原创 2021-05-24 10:18:36 · 787 阅读 · 0 评论 -
http 协议文件上传异常处理--mongoose
接着上一篇说到的,在发送文件数据前服务端出错了,且回应了,客户端应该不进行数据的发送。这里演示一种情况:指定的目录不存在,服务端应答"no suce directory",然后关闭连接。这样操作似乎是可以了,但奇怪的是,同样的代码我在嵌入式设备上测试时,结果跟这个不一样,操作嵌入式设备,文件也会传输,同时 postman 取不到应答消息,不知为何?实际能得到的结果是,客户端(postman)确实没有发送数据。原创 2022-09-02 09:29:50 · 1525 阅读 · 0 评论 -
http 协议大文件下载
响应的正文只能通过http响应消息进行传输,如果是小文件(比如小于1M)传输,则没有什么问题,直接把文件内容加载到正文进行回应即可,但如果是大文件(比如大于10M),不可能把文件内容加载到正文吧,如果更大的文件呢,100M?下载一个 19 M 的文件是可以成功的,再大的文件没有试,因为下载速度有点慢。那下载下来的文件是否有异常呢?windows上下载的,所以把这个文件拷贝到 CentOS 服务上看一下了,这两个文件经过 md5sum 后值是一样的,那我们下载的文件就是正常的。那用c++代码怎么写呢?....原创 2022-08-31 23:25:51 · 5413 阅读 · 0 评论 -
mongoose 搭建 http 服务 -- 编译
编译 32 位 json 库也很简单,修改其目录下的 Makefile,添加编译选项 -m32 即可编译出 32 位的库了。所以只能编译 32 位的程序了,修改Makefile ,添加编译选项 -m32 可以编译 32 位程序。libssl.a 和 libssl.so 静态库和动态库是有的,但都是 32 位的。Makefile 里添加库路径及库名称:-L../json -ljson。json库明明是有的,结果一看是 64 位的。3,没有编译 mongoose.c 问题。6,json 库找不到的问题。....原创 2022-08-26 19:31:52 · 932 阅读 · 0 评论 -
http 协议文件上传 - mongoose
MG_EV_HTTP_PART_BEGIN 事件时,可以获取到上传过来的文件名,MG_EV_HTTP_PART_DATA 事件时,可以获取到文件数据,所以这两个就是创建一个文件,然后往里面写数据,在 MG_EV_HTTP_PART_END 时,关闭文件,回复消息给客户端,然后断开连接。这几个事件类型,MG_EV_HTTP_PART_DATA 会调用多次,取决于上传的文件大小,及一次最大读取数据的大小(即:MG_TCP_IO_SIZE),其他的事件类型只调用一次。时调用,即 uri=/fileUpload。.原创 2022-09-01 15:18:26 · 2033 阅读 · 0 评论 -
mongoose 源码解读(一)
在上一篇文章中,我们提到 mg_mgr_poll 函数里其实调用的是 select 系统调用,最终调用的是这个函数:time_t mg_socket_if_poll(struct mg_iface *iface, int timeout_ms);而这个函数里会进行各种判断,这里我只关心发送,即写事件。函数 mg_if_can_send_cb()执行完成一次,发送缓冲区里还有数据,则 poll()里会再次触发 write 事件,然后再循环调用 mg_if_can_send_cb()函数,直到把数据发送完毕。.原创 2022-08-28 17:13:44 · 2276 阅读 · 2 评论 -
http 协议之 Content-Type
Content-Type 字段是 http 服务端返回给客户端时,head 里面带上的,这个字段表明服务端返回给客户端的 body 是什么类型的,然后客户端就可以根据这个类型进行文件处理。如浏览器客户端,针对 text/html 类型时,是直接显示或解析成网页进行展示,针对 image/jpg 时,浏览器会展示成图片,针对 audio/mpeg 类型时,就当成音频播放,针对 video/mp4 类型时,就当成视频来播放。此类型即为可读类型,text 文本时,直接显示,html 时,网页显示。......原创 2022-08-29 21:49:44 · 5983 阅读 · 2 评论 -
http 协议目录操作--mongoose
其实这个参数最主要关心两个成员:opts.document_root 和 opts.enable_directory_listing。前几篇文章已经介绍了文件的下载与上传,操作的都是文件,而如果是操作目录呢,应该怎么做呢?这里只是简单地处理了目录和普通文件的区别,还有其他如字符设备文件、块设备文件、链接文件、socket 文件这里不作处理。这样就得出了 compile 的相对路径了,那程序本身就可以访问这个目录。就是用来设置目录的,我们可以简单看下这个函数做了什么。这样目录操作就已经正常了。原创 2022-09-02 19:17:47 · 994 阅读 · 0 评论 -
mongoose 搭建http服务-下载
今天突然有个读者问到如何从搭建的服务上下载东西,于是今天调试了一下这个代码。编译后我是将程序拷贝到嵌入式板上运行的,因为一些依赖库当时编译的都是 arm 版本,所以这里没有直接在编译服务器 CentOS 上运行。我的嵌入式设备 ip 为 192.168.2.101,这里是 ssh 连接上去的。http 初次访问都会先获取一个名为 favicon.ico 的文件,这是一个图标文件。可以下载操作,但速度非常慢,不知为什么?若有大神知道,望指点指点。...原创 2022-08-25 22:38:11 · 1431 阅读 · 0 评论 -
mongoose搭建mqtt客户端
因为这个是源码是 mongoose.c C文件,编译器用的是 cc,然而用 cc 编译时,是不支持 for 循环里定义变量的,C++才支持。它实际收到的是两条消息,前一条是 hello,后一条是 goodbye。但从 MQTT.fx 发布的消息,程序没能收到,这个逻辑 mongoose 里不知道是怎么接收发布的消息的,有时间再去看了。上面这个是在公司环境下运行的结果,可能公司网络环境有些限制了,一直连接不上 mqtt 服务器。,连的是国外的 mqtt 服务器,所以在公司网络可能真的有问题。原创 2022-09-16 21:18:56 · 1242 阅读 · 2 评论 -
mongoose 文件上传-表单形式
这个得根据实际情况进行输入,如果程序是在本机运行,同时你也是通过本机的浏览器的话,这样输入是没问题的。而我的实际情况是,程序在CentOS 服务上运行,但我是在 Window10 是操作文件上传,则这个地址中的 localhost 要相应地修改在 CentOS 服务器的地址。event type = 2,查看代码是 MG_EV_POLL 事件,属于正常的,但访问时为何没有连接的反应呢?这个例子只合适上传一般的文本文件,像其他的二进制的文件是用到了其他的例子,这里不作介绍。原创 2022-09-18 23:31:22 · 1478 阅读 · 0 评论 -
mongoose 的打印改造
可以看到宏 MG_LOG(level, args) 是分为两段的,第一段前缀相当于是固定的,第二段是用户实际要输出的内容,我们只看第一段就可以了。其前 2 列表示什么一看是看不出来的,需要看代码,后几列无非就是文件名、行号、 函数名以及实际用户要输出的内容。于是就有了这篇文章,改造它这个打印输出格式。注意上面的 buf 的长度是64 字节,如果有函数名特别长那输出可能就被截断了。while 循环那里就是填充空格,我这里最多只填充5个空格,太多也不好看,原创 2022-12-16 15:53:50 · 755 阅读 · 0 评论