我读Mongoose源码----程序框架

2023-05-16

Mongoose是一种WEB服务器,因为最近在学习网络编程,所以打算研究研究它的源码,认真看了大部分,觉得学到的东西的确不少,拿出来分享一下,也和大家交流交流

至于什么是WEB服务器,以及Mongoose作为一种轻量级的WEB服务器,它有哪些优点,这里给个链接:http://www.cnblogs.com/skynet/archive/2010/07/24/1784322.html

刚开始,也是看作者的文章才产生兴趣读源码,所以分享很重要(^o^)

如果想快速的阅读源码,可以先预览一下UserManual.md这个文件,用户手册告诉我们怎么去使用这个服务器,以及如何使用它提供的功能。

好的,编译运行请看那位吴哥的文章,这里,我直接把我读源码的笔记整理出来:首先我们看程序的主体框架,细节决定成败,但是从整理上入手,我们能走的更远。

程序的框架:

Mongoose采用的是线程池模型,有两个关键的数据结构,mg_callbacks和mg_context,前者是一系列函数指针集合,在程序的执行过程中我们会调用这些函数,后者则是Mongoose的核心,数据结构后面单独分析,回到程序框架上来

main(){
//处理用户的输入
process_command_line_arguments();
//设置中断信号
signal(SIGTERM, signal_handler);
signal(SIGINT, signal_handler);
//开始
mg_start();
while(exit_flag == 0)
    sleep(1);
//结束
mg_stop();
}

程序的开始:

程序开始于mg_start,结束于mg_stop,在mg_start()中,分别生成主线程和工作线程,工作线程我们可以自己配置,默认是50个

mg_start_thread(master_thread,ctx)

mg_start_thread(worker_thread,ctx)

然后分为两条线路:

1.     Master_thread()中采用poll来处理监听套接字,对于每一个监听套接字,当有新的连接请求时,调用accept_new_connection()处理新的连接。accept_new_connection()中调用produce_socket()产生新的连接套接字,产生的连接套接字放入线程池队列中,因为是多线程,所以要考虑线程同步问题,这里采用了“生产者---消费者”模型,很好的处理了同步问题

2.     worker_thread()中作为消费者,我们调用consume_socket(),然后调用process_new_connection()来处理新的连接,实质是调用handle_request()函数,至此整个程序的框架一目了然

 

程序的结束:

我们在main函数中sleep了,当我们收到了信号例如键盘上的ctrl+c,

static voidWINCDECL signal_handler(int sig_num) {

  exit_flag = sig_num;

}

中修改了exit_flag,然后程序进入mg_stop(),

void mg_stop(struct mg_context *ctx) {
  ctx->stop_flag = 1;
  while (ctx->stop_flag != 2) {
    (void) mg_sleep(10);
  }
}

修改了mg->stop_flag = 1,然后等待其变为2, 其实就是去清理线程数据,我们在master_thread()中看到最后一句ctx->stop_flag = 2,至此,程序就退出了,以上就是程序的结束流程。

程序的框架图大体是这样的:



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我读Mongoose源码----程序框架 的相关文章

  • typeScript+egg.js+node.js后台项目搭建(一)

    typeScript egg js node js后台项目搭建 一 1 安装node js 地址 https nodejs org en 下载安装后 打开控制台cmd 输入 node v 在安装ts 可以参考typeScript中文官网 n
  • CGroup 介绍、应用实例及原理描述(已发表于IBM开发者论坛)

    插播小广告 xff0c 本人的 大话 Java性能优化 一书已经在亚马逊 京东 当当 天猫出售 xff0c 提前谢谢大家支持 原文请查看 xff1a http www ibm com developerworks cn linux 1506
  • python + celery简例

    在网上找了半天 xff0c 也没找到完整的例子 xff0c 自己写吧 1 一个队列 自定义10个优先级 xff0c 修改默认celery队列名称 1 testcelery py from celery import Celery impor
  • java+selenium获取动态下拉列表元素

    做自动化的时候 xff0c 遇到这么一个闹心问题 xff1a 研发用html里的 lt div input gt 方式 xff0c 所以无法使用select获取列表元素 原本使用Robot也可以定位 xff0c 但是headless模式 x
  • Redis安装和配置

    网上有海量的Redis文章 xff0c 写的都很详细 这里就是简单记录一下自己查aof问题过程中遇到的问题 xff0c 主要是aof文件所在目录在redis conf里的位置 1 在ubuntu16上安装Redis sudo apt get
  • mysql 主从部署

    在ubuntu 16上 xff0c 配置mysql 主从服务器 查看mysql主从命令 show variables like 39 server id 39 show variables like 39 log bin 39 show m
  • 编写的windows程序,崩溃时产生crash dump文件的办法 .

    一 引言 dump文件是C 43 43 程序发生异常时 xff0c 保存当时程序运行状态的文件 xff0c 是调试异常程序重要的方法 xff0c 所以程序崩溃时 xff0c 除了日志文件 xff0c dump文件便成了我们查找错误的最后一根
  • 网络性能测试工具iperf详细使用图文教程

    Iperf是一个网络性能测试工具 Iperf可以测试TCP和UDP带宽质量 Iperf可以测量最大TCP带宽 xff0c 具有多种参数和UDP特性 Iperf可以报告带宽 xff0c 延迟抖动和数据包丢失 利用Iperf这一特性 xff0c
  • 使用Klockwork进行代码分析简单操作流程

    前一段时间公司试用了一下klockwork公司的klockwork代码静态分析软件 xff0c 我所在项目组进行了试点 xff0c 试用后感觉不错 xff0c 有几大亮点 xff1a 1 xff09 对代码进行静态分析 xff0c 无需改动
  • C++特性:多态、重写

    说一下多态 多态就是不同的继承类对象 xff0c 针对同一消息做出不同的响应 xff0c 父类的指针指向或者绑定到子类的对象 xff0c 使得父类指针呈现多种不同的表现方式 要实现多态 xff0c 首先父类需要有一个virtual修饰的虚方
  • Jmeter(三)-简单的HTTP请求(参数化)

    xfeff xfeff 首先建立一个线程组 xff08 Thread Group xff09 xff0c 为什么所有的请求都要加入线程组这个组件呢 xff1f 不加不行吗 xff1f 答案当然是不行的 因为jmeter的所有任务都必须由线程
  • no suitable driver found for jdbc:mysql//localhost:3306/..

    xfeff xfeff 出现这样的情况 xff0c 一般有四种原因 xff1a 一 xff1a 连接URL格式出现了问题 Connection conn 61 DriverManager getConnection 34 jdbc mysq
  • java模拟键盘按键

    xfeff xfeff come from http bbs 51cto com thread 1097189 1 html 功能描述 1 打开一个记事本 2 最大化 3 模拟按键操作 现 贴出 源码 xff1a 预览源代码 打印 001i
  • Android手机通过USB数据线共享Linux电脑网络

    这里要讲述的是手机通过usb数据线共享电脑 xff08 linux系统 xff09 的网络来自由上网 通过USB数据线将手机与电脑相连 再分别在电脑和手机上虚拟出一个网络接口用于网络通信 这很类似于VPN与虚拟机上网的原理 好处是不论台式还
  • CentOS时间的查看与修改

    http www centoscn com CentOS help 2014 0805 3430 html 1 查看 修改Linux时区与时间 一 linux时区的查看与修改 1 xff0c 查看当前时区 date R 2 xff0c 修改
  • 关于"undefined reference to" 问题的原因和解决办法

    最近在Linux下编程发现一个诡异的现象 xff0c 就是在链接一个静态库的时候总是报错 xff0c 类似下面这样的错误 xff1a text 43 0x13 undefined reference to 96 func 39 关于unde
  • 跟南桑学汇编

    1 语言 1 1 机器语言 人和人沟通的桥梁 xff1a 语言 人与计算机打交道 gt 学习计算机的语言 gt 什么是机器语言 1 2 汇编语言 这些复杂的机器语言的简化 gt 助记符 xff1a 汇编语言 gt 人能够理解的语言转换成为机
  • 深度剖析Josephus ring(约瑟夫环)C语言版

    深度剖析Josephus ring xff08 约瑟夫环 xff09 C语言版 鉴于C语言更适合展示算法的底层设计 xff0c 并且便于读者的研究与思考 xff0c 故而小编使用C语言来展示约瑟夫环的精巧与奥妙 Hello xff01 xf
  • 课程设计-基于SSM实现个人健康管理系统

    作者主页 xff1a 我的主页 作者简介 xff1a Java 前端 Pythone开发多年 xff0c 做过高程 xff0c 项目经理 xff0c 架构师 主要内容 xff1a Java项目开发 毕业设计开发 面试技术整理 最新技术分享
  • Linux下的信号量----生产者与消费者

    关于信号量的函数 xff1a 初始化信号量 int sem init sem t sem int pshared unsigned int value 第一个参数是信号量 xff1b 第二个参数pshared设为0 xff0c 意思是信号量

随机推荐