要创建HTTP服务器,请按照以下格式:

  1. 通过调用mg_bind()mg_bind_opt()创建侦听连接
  2. 调用mg_set_protocol_http_websocket()创建listening连接。它附带一个内置的HTTP事件处理程序,它解析传入的数据并触发HTTP特定的事件。例如,当HTTP请求完全缓冲时,内置的HTTP处理程序会解析请求,并调用用户定义的事件处理程序,并将MG_EV_HTTP_REQUEST事件和解析的HTTP请求作为事件数据。
  3. 创建事件处理函数。请注意,事件处理程序接收所有事件 - 低级TCP事件MG_EV_RECV和高级HTTP事件,如MG_EV_HTTP_REQUEST。通常情况下,事件处理函数只能处理MG_EV_HTTP_REQUEST事件。

以下是最简单HTTP服务器的示例。为了清楚起见,省略了错误检查:

#include "mongoose.h"

static const char *s_http_port = "";

static void ev_handler(struct mg_connection *c, int ev, void *p) {
if (ev == MG_EV_HTTP_REQUEST) {
struct http_message *hm = (struct http_message *) p; // We have received an HTTP request. Parsed request is contained in `hm`.
// Send HTTP reply to the client which shows full original request.
mg_send_head(c, , hm.message.len, "Content-Type: text/plain");
mg_printf(c, "%.*s", hm.message.len, hm.message.p);
}
} int main(void) {
struct mg_mgr mgr;
struct mg_connection *c; mg_mgr_init(&mgr, NULL);
c = mg_bind(&mgr, s_http_port, ev_handler);
mg_set_protocol_http_websocket(c); for (;;) {
mg_mgr_poll(&mgr, );
}
mg_mgr_free(&mgr); return ;
}

要创建HTTP客户端,请遵循以下模式:

  1. 通过调用创建出站连接 mg_connect_http()
  2. 创建一个处理MG_EV_HTTP_REPLY事件的事件处理函数

以下是最简单HTTP客户端的示例。为了清楚起见,省略错误检查:

#include "mongoose.h"

static const char *url = "http://www.google.com";
static int exit_flag = ; static void ev_handler(struct mg_connection *c, int ev, void *p) {
if (ev == MG_EV_HTTP_REPLY) {
c->flags |= MG_F_CLOSE_IMMEDIATELY;
fwrite(hm->message.p, , hm->message.len, stdout);
putchar('\n');
exit_flag = ;
} else if (ev == MG_EV_CLOSE) {
exit_flag = ;
};
} int main(void) {
struct mg_mgr mgr; mg_mgr_init(&mgr, NULL);
mg_connect_http(mgr, ev_handler, url, NULL, NULL); while (exit_flag == ) {
mg_mgr_poll(&mgr, );
}
mg_mgr_free(&mgr); return ;
}

HTTP事件

如概述所述,mg_set_protocol_http_websocket()函数解析输入数据,将其视为HTTP或WebSocket,并触发高级HTTP或WebSocket事件。以下是HTTP特有的事件列表。

  • MG_EV_HTTP_REQUEST:HTTP请求到达。解析的请求struct http_message通过处理程序的void *ev_data指针传递 。
  • MG_EV_HTTP_REPLY:HTTP回复已到。解析的回复struct http_message通过处理程序的void *ev_data 指针传递。
  • MG_EV_HTTP_MULTIPART_REQUEST:多部分POST请求已到。此事件在body解析之前发送。此后,用户应该期望一系列MG_EV_HTTP_PART_BEGIN / DATA / END请求。这也是头文件和其他请求字段可访问的最后一次。
  • MG_EV_HTTP_CHUNK:一个HTTP分块编码块到了。解析的HTTP回复struct http_message通过处理程序的void *ev_data指针传递。http_message::body将包含不完整的,重新组合的HTTP身体。它将随着到达的每一个新的块增长,并且可能消耗大量的内存。事件处理程序可以处理以分块形式到来的body,并通知Mongoose通过设定在mg_connection::flags中的MG_F_DELETE_CHUNK来删除body。当接收到最后一个零块时,Mongoose会发送MG_EV_HTTP_REPLY具有完全重新组合的身体的事件(如果处理程序没有指示删除块)或空的身体(如果处理程序发出信号删除块)。
  • MG_EV_HTTP_PART_BEGIN:多部分消息的新部分启动,额外的参数将以mg_http_multipart_part发送
  • MG_EV_HTTP_PART_DATA:来自多部分消息的新部分数据没有附加头可用,只有数据和数据大小
  • MG_EV_HTTP_PART_END:接收到最后一个边界,可能用于找到包的结尾注意:Mongoose应使用MG_ENABLE_HTTP_STREAMING_MULTIPART进行编译,以启用多部分事件。

提供文件

API函数mg_serve_http()可以轻松地从文件系统提供文件。一般来说,该功能是提供静态文件CGI和SSI的HTTP服务器的实现。它的行为是由整合到结构中的选项列表驱动的struct mg_serve_http_opts 。有关完整的功能列表,请参阅struct mg_serve_http_opts定义mg_serve_http()

例如,为了创建一个从当前目录提供静态文件的Web服务器,实现如下的事件处理函数:

static void ev_handler(struct mg_connection *c, int ev, void *ev_data) {
if (ev == MG_EV_HTTP_REQUEST) {
struct mg_serve_http_opts opts; memset(&opts, , sizeof(opts); // Reset all options to defaults
opts.document_root = "."; // Serve files from the current directory mg_serve_http(c, (struct http_message *) ev_data, s_http_server_opts);
}
}

其他选项请参考:
https://docs.cesanta.com/mongoose/master/#/overview/event-handler.md/

mongoose 开源http库(2) --HTTP服务示例的更多相关文章

  1. mongoose 开源http库

    Mongoose是一个用C编写的网络库.它为客户端和服务器模式实现TCP,UDP,HTTP,WebSocket,CoAP,MQTT的事件驱动的非阻塞API. 设计理念: Mongoose有三个基本的数 ...

  2. BootCDN 开源项目免费 CDN 加速服务,Jquery插件库

    2017-11-17  19:38:32 免费好用的在线 css js 文件引用 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 Jquery插件库 .

  3. Pugixml一种快速解析XML文件的开源解析库

    Pugixml是一个轻量级的C++ XML开源解析库,DOM形式的解析器.接口和丰富的遍历和修改操作,快速的解析,此外支持XPath1.0实现数据查询,支持unicode编码: 使用Pugixml可通 ...

  4. [C#技术] .NET平台开源JSON库LitJSON的使用方法

    一个简单示例: String str = "{’name’:’cyf’,’id’:10,’items’:[{’itemid’:1001,’itemname’:’hello’},{’itemi ...

  5. 开源 JSON 库解析性能对比( Jackson / Json.simple / Gson )

    Json 已成为当前服务器与 web 应用之间数据传输的公认标准. 微服务及分布式架构经常会使用 Json 来传输此类文件,因为这已经是 webAPI 的事实标准. 不过正如许多我们习以为常的事情一样 ...

  6. 推荐3个小程序开源组件库——Vant、iView、ColorUI

    推荐3个小程序开源组件库 在进行小程序开发时,经常会遇到编写组件方面的阻碍,这让我们花费大量的时间在页面以及 CSS 样式编写上.因此可以使用开源组件库,有些复杂的组件可以直接拿来使用,节省开发时间, ...

  7. 开源的库RestSharp轻松消费Restful Service

    现在互联网上的服务接口都是Restful的,SOAP的Service已经不是主流..NET/Mono下如何消费Restful Service呢,再也没有了方便的Visual Studio的方便生产代理 ...

  8. .NET平台开源JSON库LitJSON的使用方法

    下载地址:LitJson.dll下载 一个简单示例: String str = "{'name':'cyf','id':10,'items':[{'itemid':1001,'itemnam ...

  9. Linux下经常使用的C/C++开源Socket库

    1.      Linux Socket Programming In C++ : http://tldp.org/LDP/LG/issue74/tougher.html 2.      ACE: h ...

随机推荐

  1. VS2017 中安装SVN

    VS2017 中安装SVN   1.下载:SVN For Vs2017 2.安装: 先关闭VS2017,找到下载文件,直接双击,安装. 3.启用插件 打开Vs2017,直接可用.

  2. nginx禁止指定的user_agent访问

    #禁止指定user_agent(浏览器标识)if ($http_user_agent ~ 'curl|baidu'){ return 403;} if ($http_user_agent ~* 'cu ...

  3. Struts+Hibernate+Spring面试题合集及答案

    Struts+Hibernate+Spring面试题合集及答案 Struts+Hibernate+Spring面试题合集 1 1. Hibernate部分 2 1.1. Hibernate工作原理 2 ...

  4. JS点击img图片放大再次点击缩小JS实现 简单实用Ctrl+C+V就可以用

    业务需要,从后台获取的图片列表,用img标签展示,用户需要查看大图.记录下来以便学习和参考.示例图如下: 放大之前: 放大之后: 点击后放大(由于图片高度超出了页面,需要通过overflow:auto ...

  5. LeetCode.1051-身高检查器(Height Checker)

    这是小川的第390次更新,第420篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第252题(顺位题号是1051).要求学生按身高递增的顺序站列来拍年度照片. 返回没有站在 ...

  6. 【神经网络与深度学习】如何将别人训练好的model用到自己的数据上

    caffe团队用imagenet图片进行训练,迭代30多万次,训练出来一个model.这个model将图片分为1000类,应该是目前为止最好的图片分类model了. 假设我现在有一些自己的图片想进行分 ...

  7. 【嵌入式开发】树莓派h264实时视频监控

    FishXX之前用VLC串流输出视频,在电脑上需要VLC播放器.试了一下,感觉还是有点延时. 今天发现一个更加流畅,也不需要VLC播放器的树莓派远程视频监控方法,直接在浏览器中打开即可. 地址:htt ...

  8. vue2.X + HTML5 plus 拍照和调用设备相册 另附 图片转base64和压缩图片方法

    HTML5 部分 <button @click="tesCamera()" type="button" :disabled="isshStatu ...

  9. HDU 2094 产生冠军(STL map)

    产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. 【6.28校内test】T2 【音乐会】二重变革

    [音乐会]二重变革[题目链接] T2其实是一道数学题,因为你看: 2MB??一共就可以存下个int,然鹅再看数据范围: 那么大是稳稳的不是TLE就是MLE了,所以肯定是数学题,而且是只需要存很少数据的 ...