▲ mongoose web服务器源码剖析
文章平均质量分 78
mongoose是当下企业中使用非常广泛的网络库,它为TCP、DUP、HTTP、WebSocket、CoAP、MQTT实现了事件驱动型的非阻塞API。本专栏是全网最为详细、最为全面的系列教程。通过本专栏的阅读学习,能让你快速上手mongoose,短时间内精通mongoose的底层原理和系统架构。
优惠券已抵扣
余额抵扣
还需支付
¥99.90
¥299.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
内核之道
某大厂资深技术专家,精通PostgreSQL内核、专注于『NVR、AI超脑、智能应用服务器』开发
展开
-
【022】 mongoose V7.6源码有内存拷贝缺陷,我给mongoose提了一个issue
文章目录1. mg_iobuf_resize()函数2. memmove()和memcpy()函数细微差异1. mg_iobuf_resize()函数我在《mongoose V7.4源码剖析之读取客户端数据》一文的2.4节中有对mg_iobuf_resize()函数的功能做过详细的说明。它动态申请内存空间,用于存储已连接套接字fd中,客户端发送的数据。该函数的内存大小申请规则是:2048KB、4096KB、8192KB . . . . . .(即每次申请的大小是在之前的基础上增加2048KB)。若原创 2022-03-01 11:55:53 · 598 阅读 · 1 评论 -
【015】 mongoose V7.4源码剖析之HTTP特定协议回调函数
文章目录1. 特殊协议回调函数http_cb2. 详聊 struct mg_http_message3. 1. 特殊协议回调函数http_cb在《mongoose V7.4核心篇之mgr管理用户请求套接字(五)》一文的2.4小节和《mongoose V7.4源码剖析之读取客户端数据(八)》一文的3.1小节中,有提到过http_cb()函数。它是mongoose服务为了实现HTTP(应用层)协议而在源码中实现的一个特殊回调函数,它在创建mongoose监听套接字以及其关联变量c时候(更多细节请阅读《mo原创 2021-10-16 16:57:06 · 3224 阅读 · 16 评论 -
【027】mongoose V6.4之创建监听套接字fd
开始轮询监听套接字这几个接口在所有mongoose源码系列中都保存一致,差异可能是在函数体内部的实现上。在开始正文内容前,建议大家先去阅读下面的这几篇文章,将会帮助快速地熟知本文的所要讲述的内容。是一个入口,函数体中会调用具体的函数来实现相关功能,比如解析用户指定的。,创建监听套接字fd、将监听套接字。管理句柄、创建监听套接字。关联、添加到到管理句柄。一样,创建监听套接字。原创 2022-09-21 15:17:29 · 347 阅读 · 0 评论 -
【026】mongoose V6.4之创建mongoose管理句柄
本专栏中已经对mongooseV7.4版本源码进行了详细的研究和分析,同时输出了大量的底层原理实现文章。截止本文撰写的时候,mongoose已经发布了最新的V7.8版本,从架构上来讲,V7.4和V7.8没有多差异,只是修复了一些已知缺陷。但是V6.14版本的差异就比较大,而且当前还有许多读者项目中使用的是mongooseV6.4版本,在这个版本中遇到了许多性能问题,以及奇怪的现象,而无法找到问题解决方法。因此,我这里将对V6.4版本进行一个源码分析,以帮助大家解决项目中遇到的问题。原创 2022-09-21 11:52:56 · 336 阅读 · 0 评论 -
【025】mongoose V6.4开启日志打印
一文中讲述了怎么在自己的项目中使用mongoose,如何去定制一套满足自己需要的mongose web服务器。在restful_server.c同级目录下,有Makefile文件,make -j。这里以V6.4为例,默认情况下,mongoose源码中的。日志打印是被不生效的,即不启用日志打印,比如我们这里以。原创 2022-09-20 10:26:34 · 468 阅读 · 0 评论 -
【024】 快速上手mongoose web服务器
因此,这一篇文章我将更加详细、全面地介绍通过moongoose编写自己的一套web服务器。但是最近收到不少读者的私信反馈,希望能够出一篇介绍怎么快速地把mongoose运用到项目中文章。函数,完善该函数的内部实现。在该示例中,该函数实现比较简单,如果是一个。源码的底层原理和实现,通过阅读这些博文,能够快速地让你掌握。”这样的一个目录,该目录下将会给出怎样使用该开源代码的。在实际项目中,你需要根据自己的需要来实现这个。进行编写,完善一下就可以实现你想要的效果。在前面的多篇文章中,我们详细地剖析了。原创 2022-09-19 19:49:09 · 1325 阅读 · 0 评论 -
【023】mongoose V7.4 客户端一次性发送上百KB的数据,mongoose怎么处理?
文章目录1. 回顾mongoose接收客户端数据流程2. 1. 回顾mongoose接收客户端数据流程之前在《mongoose V7.4源码剖析之读取客户端数据》 一文的2.4节中有详细讲解过,mongoose服务器去接收客户端发送的数据的详细流程。本文中,将再次对这个过程进行回顾。此外,还引入两个问题:(1) mongoose服务器是否知道已连接套接字(客户端)每次发送了多少数据?(2) mongoose服务器每次(从内核读缓冲区)读取多少的数据?这两个问题,对于理解mongoose服务器与客户原创 2022-03-03 11:35:18 · 692 阅读 · 3 评论 -
【021】mongoose V7.4源码剖析之套接字fd何时准备好读写
文章目录1. 概述在《mongoose V7.4源码剖析之响应客户端报文(九)》一文中,我们详细地描述了mongoose服务器是如何响应客户端数据的过程。它是先将待响应数据写入与该连接套接字fd相关联的变量c中成员send的指针变量成员buf所执行的内存缓冲区中。然后通过mg_mgr_poll()轮询监听函数,遍历mgr管理链表中的每一个连接节点(struct mg_connection类型)c,并通过判断该变量c中的成员send中的成员len的值否大于0,从而决定是否将该套接字fd加入到select(原创 2021-10-23 15:20:20 · 358 阅读 · 0 评论 -
【019】mongoose V7.4源码剖析之销毁struct mg_connection链接
文章目录1. 销毁struct mg_connection链接的两种触发方式1. 销毁struct mg_connection链接的两种触发方式在本文里,将详细分析mongoose是如何去销毁mgr管理链表中指定的struct mg_connection类型变量c。这里涉及到链表的遍历查找操作,本质上,就是一个以mgr为头结点,通过不断遍历该链表中的所有节点(struct mg_connection数据类型变量),以找到满足条件的那个节点,然后释放该数据类型中的一些指针成员,最后释放掉本身的一个操作原创 2021-10-22 09:21:54 · 335 阅读 · 0 评论 -
【018】mongoose V7.4源码剖析之mg_iobuf_free()函数
文章目录1. 概述2. mg_iobuf_free()函数实现1. 概述在《mongoose V7.4源码剖析之mg_iobuf_del()函数的两大特性(十)》一文中,详细地分析了mg_iobuf_del()函数的两大特性和作用,虽然函数名带有del,然而它实际上却不负责内存空间的删除与释放操作。对于变量c中接收客户端发送数据的recv成员buf缓冲区,以及响应客户端数据的send成员buf缓冲区的内存空间释放操作是由函数mg_iobuf_free()负责完成。2. mg_iobuf_free()函原创 2021-10-21 11:34:00 · 357 阅读 · 0 评论 -
【017】mongoose V7.4源码剖析之mg_iobuf_del()函数的两大特性
文章目录1. mg_iobuf_del()函数1.1 初始化不再使用的数据的内存地址空间1.1.1 理解memmove()函数内存重叠1. mg_iobuf_del()函数函数mg_iobuf_del()在《mongoose V7.4源码剖析之读取客户端数据(八)》 和《mongoose V7.4源码剖析之响应客户端报文(九)》两文中都有用到过。它分别用来初始化(将不再使用的数据对应大小的内存地址初始化为0)“读取客户端数据成员recv中的buf缓冲区”,以及“响应客户端数据成员send中的buf缓冲区原创 2021-10-20 20:41:26 · 475 阅读 · 0 评论 -
【016】mongoose V7.4源码剖析之响应客户端报文
文章目录1. 概述2. mongoose 如何响应客户端数据2.11. 概述在《mongoose V7.4源码剖析之读取客户端数据(八)》一文中,通过图文并茂的方式,详细地讲解了mongoose服务器是背后读取客户端写数据的过程和原理。作为一个web服务器,在接收、读取并处理完成数据之后,我们需要给连接的客户端响应一个HTTP报文。在mongosoe 7.4版本中,相较于读取客户端发送的数据,mongoose如何响应数据这部分逻辑更加复杂一些。主要涉及到许多的细节部分,而其中每一个细节都将对整个原创 2021-10-19 19:19:13 · 804 阅读 · 0 评论 -
【013】mongoose V7.4源码剖析之读取客户端数据
文章目录1. 概述2. 读取客户端发送的数据1. 概述在客户端与mongoose服务器建立了连接(完成三次握手)之后,内核会为本次的通信连接创建一个未使用的最小的文件描述符fd。接着创建一个struct mg_connection类型的变量,并且与该套接字fd关联起来,并将其添加到mgr管理链表中。更多详细的细节信息阅读《mongoose V7.4核心篇之mgr管理用户请求套接字(五)》。之后mongoose服务器会定期轮询该mgr链表中的所有套接字,并使用select()多路I/O复用的方式来对每原创 2021-10-15 10:22:41 · 759 阅读 · 6 评论 -
【014】mongoose V7.4源码剖析之用户自定义回调函数
文章目录1. 1.原创 2021-10-14 14:39:47 · 209 阅读 · 0 评论 -
【012】 mongoose V7.4源码剖析之mgr管理用户请求套接字
文章目录1. 概述2. mongoose如何管理用户的socket连接2.1 为客户端连接创建套接口fd2.2 连接请求并发量不能超过FD_SETSIZE2.3 为本次连接请求创建一个mg_connection变量2.4 将连接添加到mgr管理链表1. 概述拓展阅读:《mongoose V7.4之本创建管理句柄 (一)》《mongoose V7.4之创建监听端口 (二)》《mongoose V7.4之创建mg_connection网络连接(三)》《mongoose V7.4核心篇之轮询监听soc原创 2021-10-14 13:16:28 · 392 阅读 · 2 评论 -
【020】mongoose V7.4源码剖析之最多同时支持多少个socket请求连接
对于mongoose 7.4版本,其能够支持最多同时连接的socket数量请阅读《mongoose V7.4核心篇之轮询监听socket请求(四)》的第5节。原创 2021-10-13 16:54:56 · 290 阅读 · 0 评论 -
【011】 mongoose V7.4源码剖析之轮询监听socket请求
文章目录1. 概述1. 概述《mongoose V7.4之本创建管理句柄 (一)》《mongoose V7.4之创建监听端口 (二)》《mongoose V7.4之创建mg_connection网络连接(三)》《mongoos V6.14源码剖析之基础篇(一)》《mongoose V6.14源码剖析之创建管理句柄(二)》《mongoose V6.14源码剖析之绑定监听端口(三)》...原创 2021-10-12 19:23:28 · 570 阅读 · 20 评论 -
【010】 mongoose V7.4源码剖析之创建mg_connection网络连接
文章目录1. 概述2. 创建一个connection网络连接1. 概述当成功创建了一个mgr管理句柄,以及socket监听之后,接下来需要创建一个socket网络连接。如果对创建mgr管理句柄以及socket监听流程不熟悉,请先阅读下面几篇文章,再继续本文。《mongoose-7.4之本创建管理句柄 (一)》《mongoose-7.4之创建监听端口 (二)》《mongoose-6.14源码剖析之基础篇(一)》《mongoose-6.14源码剖析之创建管理句柄(二)》《mongoose-6.14原创 2021-10-12 16:51:41 · 753 阅读 · 0 评论 -
【009】 mongoose V7.4源码剖析之创建监听套接字fd
文章目录1. mg_connection结构声明1. mg_connection结构声明在继续本篇及之后的系列文章阅读之前,强烈建议先去回顾之前我这边写的几篇文章,这能帮你快速地熟悉mongoose服务,包括其内部重要数据结构、大致工作原理等。《mongoose 6.14源码剖析之基础篇(一)》《mongoose 6.14源码剖析之创建管理句柄(二)》《mongoose 6.14源码剖析之绑定监听端口(三)》社区一直在维护着mongoose源码,并且版本更新较为频繁,并且每次大版本的迭代更新,都原创 2021-10-12 11:35:18 · 507 阅读 · 0 评论 -
【008】 mongoose V7.4源码剖析之本创建管理句柄
文章目录1. mgr管理句柄结构声明1.1 mgr管理句柄初始化1. mgr管理句柄结构声明mongoose最新版本是7.4,我在《mongoose 6.14源码剖析之创建管理句柄(二)》一文中曾对6.14版本的mgr管理句柄结构声明做了分析,如下:struct mg_mgr { struct mg_connection *active_connections;#if MG_ENABLE_HEXDUMP const char *hexdump_file; /*调试己转储文件路径*/#e原创 2021-10-12 10:46:10 · 639 阅读 · 3 评论 -
【004】 完全掌握URL
文章目录1. URL2.3.4.1. URL URL(Uniform Resource Locator, 统一资源定位符), 它是因特网上资源的一种标准化名称, 提供了一种统一的资源命名方式. 人与应用程序通过URL来寻找因特网上所需的资源, 换言之, 即URL提供了一种定位因特网上任意资源的手段. URL可分为三部分: 方案 + 主机 + 资源具体路径 1)部分: URL方案(scheme): 表示Web客户端要以什么样的方式去访问原创 2020-07-27 14:39:26 · 401 阅读 · 0 评论 -
【005】 HTTP协议之报文格式
文章目录1. HTTP概述2. HTTP报文格式2.1 HTTP请求报文格式2.2 HTTP响应报文格式3. HTTP报文之URL组成3.1 HTTP协议URL和URI区别4. 总结1. HTTP概述 2. HTTP报文格式 2.1 HTTP请求报文格式 2.2 HTTP响应报文格式 ...原创 2020-01-20 15:33:21 · 700 阅读 · 0 评论 -
【006】 HTTP因换行符的缺少而导致失败
1. 附上截图:1左边的截图上是采用Postman请求失败的;右边的截图是使用SoupUI请求成功的。可以看到,左图的末尾缺少了: 0d 0a , 查询了下 ASCII 表,十六进制 0x0a表示:\r 0x0d表示:\n ...原创 2019-03-22 19:33:41 · 997 阅读 · 0 评论 -
【001】 Mongoose V6.14源码剖析之基础篇
文章目录1 Mongoose介绍2 Mongoose1 Mongoose介绍 Mongoose 是一款嵌入式 web服务器。使用C语言编写,它可以很容易的嵌入到其他平台或是程序中,并为其提供了web接口,它具有很强的可移植性,而且对跨平台编译支持得非常出色。它是用于嵌入式网络编程的瑞士军刀。为客户端和服务器模式实现了用于TCP,UDP,HTTP,WebSocket,CoAP,MQTT的...原创 2019-10-26 10:25:09 · 2909 阅读 · 5 评论 -
【003】 Mongoose V6.14源码剖析之绑定监听端口
文章目录1. 概述2. 创建监听端口2.1 解析监听端口地址2.1.1 确定SOCKET 类型2.1.2 解析监听ip和端口2.1.2.1 参数格式为“ip:port”格式,直接解析得出待监听的设备ip和端口port2.1.2.2 系统配置文件“/etc/hosts”下读取文件并获取对应的ip地址2.1.2.3 通过gethostbyname获取设置ip地址2.1.2.4 监听本机INADDR_ANY的指定端口2.1.3 附上mg_parse_address()的完整代码2.2 对源码的建议2.3 创建端口原创 2021-02-26 16:31:07 · 479 阅读 · 2 评论 -
【002】 mongoose V6.14源码剖析之创建管理句柄(二)
文章目录1. 概述2. 初始化Mongoose句柄2.1 Mngoose 三个基本数据结构2.1.1 struct mg_mgr 拥有所有活动的事件管理器2.1.2 struct mg_connection 连接2.1.3 struct mbuf 数据缓冲区(接收/发送的数据)2.22.31. 概述 关于Mongoose的功能、编译方式、适用平台等特性已在《Mongoose-6.1...原创 2020-02-13 16:36:33 · 989 阅读 · 0 评论 -
【007】 嵌入式Web服务器 Mongoose:mg_bind绑定端口失败,返回null
1. 本文不对mongoose的功能作陈述,只记录下自己开发中遇到的坑,及解决方案。嵌入了mongoose的代码编译通过,在调试运行(gdb)时候,却发生了段错误(Segmentation fault),如下所示:...原创 2019-03-18 16:24:35 · 1804 阅读 · 0 评论