1.需要使用c++提供http服务,本来想使用libevent,但是经过一番搜索后,发现了只需要引用2个文件的mongoose库。

官方文档:https://cesanta.com/docs/overview/intro.html

官方代码:https://github.com/cesanta/mongoose

2.相关代码

  1. #include "HttpService.h"
  2.  
  3. struct mg_serve_http_opts HttpService::s_http_server_opts;
  4.  
  5. //请求事件处理
  6. void HttpService::mgEvHandler(struct mg_connection *nc, int ev, void *p) {
  7. //处理request
  8. if (ev == MG_EV_HTTP_REQUEST) {
  9. struct http_message *msg = (struct http_message *)p;
  10.  
  11. //body内容
  12. char* body = new char[msg->body.len + ];
  13. memset(body, , msg->body.len + );
  14. memcpy(body, msg->body.p, msg->body.len);
  15.  
  16. //uri内容
  17. char* uri = new char[msg->uri.len + ];
  18. memset(uri, , msg->uri.len + );
  19. memcpy(uri, msg->uri.p, msg->uri.len);
  20.  
  21. //返回body信息
  22. mgSendBody(nc, "body content");
  23.  
  24. //返回下载文件
  25. //mgSendFile("相对于s_http_server_opts.document_root的文件路径");
  26.  
  27. delete uri;
  28. delete body;
  29. }
  30. }
  31.  
  32. //发送body信息
  33. void HttpService::mgSendBody(struct mg_connection *nc, const char *content) {
  34. mg_send_head(nc, , strlen(content), "Content-Type: text/plain\r\nConnection: close");
  35. mg_send(nc, content, strlen(content));
  36. nc->flags |= MG_F_SEND_AND_CLOSE;
  37. }
  38.  
  39. //发送文件,文件的位置是相对于s_http_server_opts.document_root的路径
  40. void HttpService::mgSendFile(struct mg_connection *nc, struct http_message *hm, const char* filePath) {
  41. mg_http_serve_file(nc, hm, filePath, mg_mk_str("text/plain"), mg_mk_str(""));
  42. }
  43.  
  44. //初始化并启动
  45. bool HttpService::start(const char *port) {
  46. struct mg_mgr mgr;
  47. struct mg_connection *nc;
  48.  
  49. mg_mgr_init(&mgr, NULL);
  50. printf("Starting web server on port %s\n", port);
  51. nc = mg_bind(&mgr, port, mgEvHandler);
  52. if (nc == NULL) {
  53. printf("Failed to create listener\n");
  54. return false;
  55. }
  56.  
  57. // Set up HTTP server parameters
  58. mg_set_protocol_http_websocket(nc);
  59. s_http_server_opts.document_root = "."; //文件相对路径 Serve current directory
  60. s_http_server_opts.enable_directory_listing = "yes";
  61.  
  62. for (;;) {
  63. mg_mgr_poll(&mgr, ); //1s轮训一次
  64. }
  65. mg_mgr_free(&mgr);
  66.  
  67. return true;
  68. }

3.vs2019项目工程文件下载:vs2019_HttpSvr.zip

以上。

C++ http服务的更多相关文章

  1. solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件

    昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...

  2. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  3. 启动了VSAN服务的主机不在vCenter集群中

    背景: 这个问题的来源是,某用户将该ESXi主机直接夺取到另一个vCenterA的管辖中,而这个vCenterA中集群A开启了VSAN功能,导致再次反向夺取到vCenterB中的时候带有了来自于集群A ...

  4. node服务的监控预警系统架构

    需求背景 目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作.不同于个人开发的简单服务器,企业级的node服务要求更为苛刻: 高稳定性.高可靠性.鲁棒性以及直观的监控和报警 ...

  5. 通过AngularJS实现前端与后台的数据对接(二)——服务(service,$http)篇

    什么是服务? 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性. 服务是一个单例对象,在每个应用中只会被实例化一次(被$injector实例化) ...

  6. 本人提供微软系.NET技术顾问服务,欢迎企业咨询!

    背景: 1:目前微软系.NET技术高端人才缺少. 2:企业很难直接招到高端技术人才. 3:本人提供.NET技术顾问,保障你的产品或项目在正确的技术方向. 技术顾问服务 硬服务项: 1:提供技术.决策. ...

  7. 使用 Roslyn 编译器服务

    .NET Core和 .NET 4.6中 的C# 6/7 中的编译器Roslyn 一个重要的特性就是"Compiler as a Service",简单的讲,就是就是将编译器开放为 ...

  8. C#高性能TCP服务的多种实现方式

    哎~~ 想想大部分园友应该对 "高性能" 字样更感兴趣,为了吸引眼球所以标题中一定要突出,其实我更喜欢的标题是<猴赛雷,C#编写TCP服务的花样姿势!>. 本篇文章的主 ...

  9. 使用ServiceStack构建Web服务

    提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Bu ...

  10. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

随机推荐

  1. djang小项目过程中的小问题 02(跳转界面)

    我觉着自己生下来就是解决问题的 ##1. 今天在使用登录注册模板时,输入后缀index,正常显示登录界面,但是点击 立即注册 之后不会跳转到注册页面 因为我观察到后缀名发生变化了,但是出发点是错的,前 ...

  2. 洛谷 P3998 [SHOI2013]发微博

    洛谷 P3998 [SHOI2013]发微博 洛谷传送门 题目描述 刚开通的 SH 微博共有n个用户(1Ln标号),在这短短一个月的时间内, 用户们活动频繁,共有m 条按时间顺序的记录: ! x 表示 ...

  3. 史上最全的CSP-J/S 第一轮知识点

    CSP-J/S 第一轮知识点选讲 \(NOIP\)(全国青少年信息学奥林匹克竞赛)于2019年取消.取而代之的是由\(CCF\)推出的非专业级软件能力认证,也就是现在的\(CSP-J/S\).作为一名 ...

  4. 第02组 Beta冲刺(2/4)

    队名:十一个憨批 组长博客 作业博客 组长黄智 过去两天完成的任务:了解整个游戏的流程 GitHub签入记录 接下来的计划:继续完成游戏 还剩下哪些任务:完成游戏 燃尽图 遇到的困难:没有美术比较好的 ...

  5. 网络1911、1912 C语言第5次作业--循环结构 批改总结

    如题 一.评分规则 1.伪代码务必是文字+代码描述,直接反应代码,每题扣1分 2.提交列表没内容,或者太简单,每题得分0分.注意选择提交列表长的题目介绍. 3.代码格式不规范,包括命名随意.继续扣分. ...

  6. [LeetCode] 374. Guess Number Higher or Lower 猜数字大小

    We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...

  7. [LeetCode] 35. Search Insert Position 搜索插入位置

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  8. 第09组 Beta冲刺(4/5)

    队名:观光队 链接 组长博客 作业博客 组员实践情况 王耀鑫 过去两天完成了哪些任务 文字/口头描述 学习 展示GitHub当日代码/文档签入记录 无 接下来的计划 完成短租车,页面美化 还剩下哪些任 ...

  9. Ubuntu 获取内核源码树

    输入:apt-cache search linux-source //查看内核版本 输入:apt-get install linux-source-3.0.0 //获取对应版本的内核,默认安装在/us ...

  10. Qt Quick 常用元素:Textinput 与 TextEdit 文本编辑框

    一.Textinput Textinput 用于编辑一行文本,类似于 QLineEdit. font 分组属性允许你设置 Textlnput 元素所用字体的各种属性,包括字体族(family).大 小 ...