mongoose框架示例代码解析(一)


参考:

  1. Mongoose Networking Library Documentation(Server)
  2. Mongoose Networking Library Documentation(Client)

前言:

OK,感谢完恩公,来看看今天的正文吧~对了,把昨天写时隔九年重新遇到半个初恋的博客置顶一下,时刻给自己一些刺激。这里也放个链接,没错,皮这一下我很快乐!初步了解mac下C源码的编译过程_qq_31433709的博客-CSDN博客

不得不说,起名字真的是一门学问,这两个源文件的方法名还有参数名称都堪称完美一目了然!

说起来,我vim上的C环境都还没有弄呢,这撸代码的过程感觉真的不够快乐!晚上顺便搞定吧!如果没有找到(虽然这个相当不现实),那就顺便学学怎么编写插件吧= =!


正文

一. 服务器端:

源码文件:simplest_web_server.c

// Copyright (c) 2015 Cesanta Software Limited
// All rights reserved#include "mongoose.h"static const char *s_http_port = "8000";
static struct mg_serve_http_opts s_http_server_opts;static void ev_handler(struct mg_connection *nc, int ev, void *p) {if (ev == MG_EV_HTTP_REQUEST) {mg_serve_http(nc, (struct http_message *) p, s_http_server_opts);}
}int main(void) {struct mg_mgr mgr;struct mg_connection *nc;mg_mgr_init(&mgr, NULL);printf("Starting web server on port %s\n", s_http_port);nc = mg_bind(&mgr, s_http_port, ev_handler);if (nc == NULL) {printf("Failed to create listener\n");return 1;}// Set up HTTP server parametersmg_set_protocol_http_websocket(nc);s_http_server_opts.document_root = ".";  // Serve current directorys_http_server_opts.enable_directory_listing = "yes";for (;;) {mg_mgr_poll(&mgr, 1000);}mg_mgr_free(&mgr);return 0;
}

(1)先初步扫一眼:

呜呜,好多已经被封进框架的方法调用,常量和结构体:

  1. 结构体:
  • mg_mgr
  • mg_connection
  • mg_serve_http_opts
  1. 方法调用:
  • mg_mgr_init
  • mg_bind
  • mg_serve_http
  • mg_set_protocol_http_websocket
  • mg_mgr_pool
  • mg_mgr_free
  1. 常量:
  • MG_EV_HTTP_REQUEST

只导入了一个头文件,去这里面找找呗= =,哇,6277行,ok,小朋友,你是不是有很多疑问?
头文件中能获取到的我感觉最多只有常量,而方法的实现和结构体的定义,我还是感觉要从.c文件中去获取。

(2)那就先看看头文件吧

vim全局搜一下,MG_EV_HTTP_REQUEST的结果,找到定义就行了,其余的嘛,本来想也列出来,不过为了篇幅的简约,还是省略比较好,个人感觉(大概瞄了一下~),然后我发现无论是结构体还是方法调用抑或是常量,在头文件里面都有很具体的讲解,甚至有示例代码,所以建议直接在mongoose.h文件中自行搜索,然后对于mg_mgr_pool的1000参数,还是需要看.c文件中的具体实现

然后这是我大体理了一圈的结果,毕竟是第一次写这方面的内容,差是差了点,不过毕竟是为了自我的提升(自我安慰),总有从差到好的过程嘛!

// Copyright (c) 2015 Cesanta Software Limited
// All rights reserved//导入mongoose所依赖的必须头文件
#include "mongoose.h"//指定默认的服务器http端口号
static const char *s_http_port = "8000";
//指定http链接的各种选项
static struct mg_serve_http_opts s_http_server_opts;//ev_handler指定的event handler,即事件处理,mg指代的是mongoose
static void ev_handler(struct mg_connection *nc, int ev, void *p) {if (ev == MG_EV_HTTP_REQUEST) {mg_serve_http(nc, (struct http_message *) p, s_http_server_opts);}
}//总入口,一切的开始
int main(void) {struct mg_mgr mgr;struct mg_connection *nc;//初始化mg_mar变量mg_mgr_init(&mgr, NULL);printf("Starting web server on port %s\n", s_http_port);//这里有点函数式的感觉,传入的不是对象,而是方法指针//将mgr和其中的mgr_connection以及对应的端口号还有对应的不同event的处理器所绑定,并返回对应的绑定后的mg_connection对象nc = mg_bind(&mgr, s_http_port, ev_handler);if (nc == NULL) {printf("Failed to create listener\n");return 1;}// Set up HTTP server parametersmg_set_protocol_http_websocket(nc);//设置客户端访问服务器的初始路径,这里设置为"."即为可执行文件的当前路径s_http_server_opts.document_root = ".";  // Serve current directory//同时设置是否支持显示当前目录下的文件信息s_http_server_opts.enable_directory_listing = "yes";for (;;) {//这里的1000是什么意思呢?//翻译一下文档中对这个方法的描述://这个方法执行实际上的IO操作并且必须在一个循环中被调用(一个事件循环)。//它返回了生成的用户事件数目(除了POLL)。//第二个参数是以毫秒为单位的睡眠最大时间。//该方法为IO操作检查了所有的连接(connection)。如果至少有一个连接已经准备好IO操作,此方法将切换到对应的事件处理器然后返回。mg_mgr_poll(&mgr, 1000);//所以说,1000到底是什么意思?看来光看头文件比较难啊。//ok,大概看了看实现,1000是设置的请求超时时间}//解构mg_mgr,该方法中应该同时解构了mg_connection,并释放了对应占用的内存,道理的确是这样,但是什么情况下会跳出这个死循环呢?如果我直接通过信号,貌似不会走这步,并没有看见输出stopped的信息mg_mgr_free(&mgr);printf("stopped mongoose server");return 0;
}

小结:

OK,感觉今天看到这个程序差不多了,也适当看到了一些细节,服务端的流程也基本理了一圈了。早睡早起身体好~

mongoose框架示例代码解析(一)相关推荐

  1. 通过调试微信小程序示例代码解析flex布局参数功能(一)

    通过调试微信小程序示例代码解析flex布局参数功能 官方示例小程序源代码下载地址:https://github.com/wechat-miniprogram/miniprogram-demo 通过调试 ...

  2. 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ...

  3. 【TensorFlow】多GPU训练:示例代码解析

    使用多GPU有助于提升训练速度和调参效率. 本文主要对tensorflow的示例代码进行注释解析:cifar10_multi_gpu_train.py 1080Ti下加速效果如下(batch=128) ...

  4. pion webrtc 示例代码解析 一

    pion webrtc pion 是go语言写的webrtc的开发库套装 DTLS 协议 我们对DTLS 协议要适当的解释,TLS是用于TCP的,而DTLS是用于数据报的,很多应用运行在TCP之上,但 ...

  5. 单图像超分辨率重建示例代码解析

    昨天发了单图像超分辨率重建示例,今天来对里面主要的Python代码进行讲解,如果有补充或指正,欢迎大家在评论区留言.PS:这里的代码不要直接复制粘贴使用,由于注释的关系可能会报错,建议到示例给出的gi ...

  6. 简易的深度学习框架Keras代码解析与应用

    北京 | 深度学习与人工智能研修12月23-24日 再设经典课程 重温深度学习阅读全文> 正文约12690个字,22张图,预计阅读时间:32分钟. 总体来讲keras这个深度学习框架真的很&qu ...

  7. 1.NetDh框架之数据库操作层--Dapper简单封装,可支持多库实例、多种数据库类型等(附源码和示例代码)...

    1.NetDh框架开始的需求场景 需求场景: 1.之前公司有不同.net项目组,有的项目是用SqlServer做数据库,有的项目是用Oracle,后面也有可能会用到Mysql等,而且要考虑后续扩展成主 ...

  8. dataObject可以去重吗java_python爬虫scrapy框架之增量式爬虫的示例代码

    scrapy框架之增量式爬虫 一 .增量式爬虫 什么时候使用增量式爬虫: 增量式爬虫:需求 当我们浏览一些网站会发现,某些网站定时的会在原有的基础上更新一些新的数据.如一些电影网站会实时更新最近热门的 ...

  9. php解析命令行参数选项,PHP 命令行参数解析工具类的示例代码

    PHP 命令行参数解析工具类的示例代码 /** * 命令行参数解析工具类 * @author guolinchao */ class CommandLine { // 临时记录短选项的选项值 priv ...

最新文章

  1. 我现在的vimrc配置文件
  2. C++复制控制:拷贝构造函数
  3. 亿级流量治理系列:常用的限流算法有哪些?
  4. java函数式编程之接口Default方法五
  5. Unity C# Job System介绍(二) 安全性系统和NativeContainer
  6. 什么是好的API设计? 1
  7. 51单片机入门教程(6)——外部中断
  8. Python poetry的使用
  9. .Net之Layui多图片上传
  10. 【ASP.NET 基础】ASP.NET 目录操作
  11. N81新手入门全攻略——N81常规设置问答篇
  12. 这将是你看到过最全的pdf预览解决方案
  13. Linux: E45: ‘readonly‘ option is set (add ! to override)
  14. 【MDCC专访】郑晔:用JavaScript征服物联网应用开发
  15. JAVA兔子繁衍_Java 编程经典案例之兔子繁殖迭代问题
  16. 红帽认证工程师(RHCE)的发展前景
  17. SEO批量文章繁简转换,同义词替换
  18. ubuntu etc 设置权限777带来的问题
  19. 小巧易用的分区工具——MiniTool Partition Wizard
  20. 减慢游戏运行速度_使用网络交换机会减慢我的Internet速度吗?

热门文章

  1. Python金融大数据分析——第四章数据类型和结构
  2. linux yum 安装mysql_Linux下使用yum安装MySQL
  3. matlab imcrop 对应python函数_MATLAB车牌识别之7个字符切割浅谈【抽丝剥茧】
  4. 循环数组函数c语言,C语言练习题2(分支结构循环结构数组函数2009-2012二级真题)..doc...
  5. 七牛云 直播 java_七牛云直播SDK之推流解析
  6. aide怎么打开html文件,求助!aide获取网页html源码
  7. mabatisplus怎么给实体类自定义属性_如果你的角色属性可以自定义,你会怎么点?...
  8. yii框架的下拉框多选,设置默认值等(dropDownList)
  9. 安装虚拟机Ubuntu,搭建lnmp环境碰到的坑(一)
  10. java算法题常用到的一些api,含面试题+答案