nginx 源码学习笔记(六)——nginx基本数据结构

简单的数据类型

在core/ngx_confing.h中定义了基本的数据类型的映射,大部分都映射到c语言自身的数据类型:

typedef intptr_t ngx_int_t;

typedef uintptr_t ngx_uint_t;

typedef intptr_t ngx_flag_t;

其中ngx_int_t,ngx_flag_t都映射为intptr_t;ngx_uint_t映射为uintptr_t。

这两个类型在/usr/include/stdint.h的定义为:


/* Types for `void *' pointers. */ #if __WORDSIZE == 64 # ifndef __intptr_t_defined typedef long int intptr_t; # define __intptr_t_defined # endif typedef unsigned long int uintptr_t; #else # ifndef __intptr_t_defined typedef int intptr_t; # define __intptr_t_defined # endif typedef unsigned int uintptr_t; #endif

看到这里大家应该理解,基本操作应该都是一样的。

字符串的数据类型

nginx对c语言字符串类型进行了简单的封装,core/ngx_string.h/c里面包含了这些封装的内容。其中定义了

ngx_str_t,

ngx_keyval_t,

ngx_variable_value_t

这几个基础类型:

typedef struct { size_t len; u_char *data; } ngx_str_t; typedef struct { ngx_str_t key; ngx_str_t value; } ngx_keyval_t; typedef struct { unsigned len:28; unsigned valid:1; unsigned no_cacheable:1; unsigned not_found:1; unsigned escape:1; u_char *data; } ngx_variable_value_t;

ngx_str_t 包含两个属性:len即长度, data为数据;初始化使用ngx_string宏进行:

#define ngx_string(str) {sizeof(str) -1,(u_chart*)str }

该模块在ngx_string.h和ngx_string.c中。字符串的操作一般包括:初始化,复制,格式化输出,大小写转换,查找子字符,查找子字符串,字符串转换成数字,字符串编码类型相关函数,字符串比较,trim,split等函数。在这个类中间没有调用其他模块的函数,作为一个http服务器,还需要实现URL转换,简单的html转换等函数。字符串的结构体非常简单实用,是非常值得刚入门的linux开发工程师学习的。

函数 说明
ngx_string 初始化函数
ngx_null_string 初始化空字符串函数
ngx_tolower字符转小写函数
ngx_toupper 字符转大写函数
ngx_strncmp 比较指定长度的字符串是否相同
ngx_strcmp比较字符串是否相同
ngx_strstr 从字符串中找到需要的字符串
ngx_strlen 字符串的长度
ngx_strchr 在字符串中找到匹配的字符,返回 0为匹配
ngx_strlchr 在字符串中找到匹配的字符,返回匹配的指针
ngx_memzero 把一片内存区设置为
0
ngx_memset
把一片内存区设置为指定的数
ngx_memcpy 复制内存,没有返回
ngx_cpymem 复制内存,返回复制完了dst的最后一个字符的下一个字符的指针
ngx_copy同
ngx_cpymem
ngx_memcmp
比较内存中的数据是否相同
ngx_strlow 把字符串都转换成小写
ngx_cpystrn 复制字符串,并且返回字符串的最后一个字符的下一个字符的指针
ngx_pstrdup 复制字符串到pool,返回字符串的指针
ngx_sprintf把各种类型的数据格式化输出到buf,最大的长度为
65536
ngx_snprintf
把各种类型的数据格式化输出到指定长度的
buf
ngx_strcasecmp
不分大小写比较两个字符串是否相同
ngx_strncasecmp指定长短不分大小写比较两个字符串是否相同
ngx_strnstr 在指定大小一个字符串中是否有子字符串
ngx_strstrn 在一个字符串中是否有子指定大小的字符串
ngx_strcasestrn 在一个字符串中是否有子指定大小的字符串,不区分大小写
ngx_rstrncmp 从后往前比较两个字符串是否相同,返回相同的位置
ngx_rstrncasecmp 从后往前比较两个字符串是否相同,返回相同的位置,不区分大小写
ngx_memn2cmp比较两个指定长度的内存是否相同,也比较长的内存是否包含短的内存
ngx_atoi 指定长度的字符串转换成数字
ngx_atosz指定长度的字符串转换成ssize_t类型数字
ngx_atoof 指定长度的字符串转换成off_t类型数字
ngx_atotm 指定长度的字符串转换成time_t类型数字

ngx_hextoi指定长度的字符串转换成十六进制数字
ngx_hex_dump把数字转换成16进制的字符串
ngx_encode_base64 base64编码
ngx_decode_base64base64解码
ngx_utf8_decode 把 utf8字符解码成双字节的 unicode或是单字节字符,但是该函数会移动*p的值,

请注意

ngx_utf8_length 得到utf8编码的字符占几个字节
ngx_utf8_cpystrn 赋值utf8字符串,保证完整的复制
ngx_escape_uri 对uri进行编码
ngx_unescape_uri 对uri的进行解码
ngx_escape_html 对html进行编码
ngx_sort 排序,主要是用于数组排序
ngx_qsort 快速排序
ngx_value 把宏数字转换成字符串

为了测试,我们可以用以下两种方式打印出来
1 ngx_str_t str ;
2 printf (
” %* s”
, str . len , str . data );
3 prinrf (
”%V”, & str );


基于C++和Qt开发IEC104规约主站调试软件(第二章) 本章节主要讲解iec104主站软件界面设计和从站的连接功能以及部分功能代码的展示。 阅读详情

相关推荐

手把手教你用STM32单片机DIY一个简易PLC(附完整电路图与PCB文件)

本文详细介绍了如何利用STM32单片机DIY一个简易PLC控制器,涵盖硬件设计、电路图解析、PCB布局优化及固件框架实现。通过完整的电路图和PCB文件,帮助读者从元器件选型到工业级优化,逐步构建可靠的PLC系统,特别适合工业自动化爱好者和学习者实践。

weixin_42527160的博客 571

nginx base64 编解码的一个坑

nginx 支持base64转换的函数为: ngx.decode_base64(base64_str) 例如: local dy = ngx.decode_base64(bG92ZV9kaW5neWluZwo==) bG92ZV9kaW5neWluZwo== 为love_dingying base64 编码结果 使用string.find  判断dy是否在另一个字符串中 l

吴长空的技术随笔 1万+

别光看Demo了!用UE5 Lyra框架快速搭建你的多人对战游戏原型(含完整配置流程)

本文详细介绍了如何利用UE5 Lyra框架快速搭建多人对战游戏原型,包含完整的配置流程和实战案例。Lyra作为可直接二次开发的游戏模板,内置了GAS技能系统、Enhanced Input输入控制等核心功能,大幅缩短开发周期。通过替换角色模型、调整武器数值和配置新地图规则,开发者可在48小时内完成科幻团队竞技游戏原型的搭建。

weixin_28717411的博客 457

nginx相关的一些特性

nginx断点续传功能是由ngx_http_range_filter_module实现的。 其实这个模块是由两个模块组成的,一个为ngx_http_range_header_filter_module, 用于设置http响应的头部信息,例如: 设置content-range,指定应答的区间块开始结束位置; 设置content-length, 指定断点续传时的应答包体大小; 设置206响应码而不是200响应码等等。 另一个模块为ngx_http_range_body_filter_module, 用于

focus on security 1010

ASTRA Toolbox学习笔记-Python

ASTRA Toolbox 是一个用于处理 X 射线相干散射和 X 射线传输成像的开源算法工具箱。本文档概述了该工具箱的基本概念。

hou9021的博客 8261

[AI] 企业内网部署大模型的三种常见方案:从“能用”到“好用”的技术选型指南

企业内网部署大模型的三种方案解析:本地模型安全但门槛高,平台方案(如Dify)最平衡推荐,混合架构适合进阶需求。关键路径是渐进式演进,从快速验证到平台化建设,核心在于流程优化而非单纯选模型。数据安全、成本可控和工程落地能力是决策重点。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 770

ngx.unescape_uri()函数之坑

nginx中ngx.unescape_uri()函数会将+字符转成空格,由于该现象会可能导致一些字符串匹配问题。 请求路径 调用ngx.var.request_uri前 调用ngx.var.request_uri后 curl -vv -L ww.test.com/ / > /dev/null /, /, curl -vv -L ww.test.com...

thinker 3755

学习STM32的ADC采集声音

为了采集声音信号,需要一个声音传感器(如麦克风),将声音信号转换为电压信号输入到 ADC 引脚。通过硬件准备、STM32CubeMX 配置和代码实现,我们可以实现将声音信号转换为数字信号,并进行后续处理。STM32 是一款广泛应用于嵌入式系统开发的微控制器平台,其拥有丰富的外设和强大的性能,非常适合进行 ADC(模拟数字转换)的声音采集。函数启动 ADC1 的连续转换模式,然后在一个无限循环中等待 ADC 转换完成,并读取采样结果。四、代码实现 在生成的代码中,会生成一些相关的库文件和示例代码。

m0_75244442的博客 2173

16进制转字符数组

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

haibo_kang的专栏 809

手把手教你学SIMULINK模块库文件专栏-From Workspace 模块详解

模块是 Simulink 中的一个信号源模块,用于从 MATLAB 工作区加载数据作为输入信号。该模块允许用户将预先在 MATLAB 中生成的数据(如时间序列、矩阵或结构体)导入到 Simulink 模型中,从而实现更灵活的信号输入和仿真控制。通过深入了解其参数的影响及结合 MATLAB 脚本的应用,读者可以更加有效地利用这一模块进行仿真和研究。此外,通过实际应用场景的扩展以及常见问题解答部分的帮助,能够更好地掌握。模块是一个非常灵活的工具,适用于需要从 MATLAB 工作区加载数据的各种场景。

MHD0815的博客 633

精通 Android NDK/JNI:从入门到精通实战与面试精粹

在Android开发中,

郑伟强dev的专栏 144

菜鸟nginx源码剖析数据结构篇(六) 哈希表 ngx_hash_t(上)

哈希表是一种典型的以空间换取时间的数据结构,在没有冲突的情况下,对任意元素的插入、索引、删除的时间复杂度都是O(1)。这样优秀的时间复杂度是通过将元素的key值以hash方法f映射到哈希表中的某一个位置来访问记录来实现的,即键值为key的元素必定存储在哈希表中的f(key)的位置。当然,不同的元素的hash值可能相同,这就是hash冲突,有两种解决方法(分离链表发和开放地址发),ngx采用的是开放地址法. 分离链表法是通过将冲突的元素链接在一个哈希表外的一个链表中,这样,找到hash表中的位置后,就可以通过

@Echo· 个人技术笔记 1万+

TC397 EB MCAL开发从0开始系列 之 [13.1] Dma配置实战 -实现M2M数据传输(读存储写存储)

TC3XX TC397 MCAL DMA 从0搭建测试用例-实现M2M 存储到存储数据传输

yy九歌的博客 1913

菜鸟nginx源码剖析数据结构篇(一)动态数组ngx_array_t

菜鸟nginx源码剖析数据结构篇(四)红黑树ngx_rbtree_t   Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.youkuaiyun.com/chen19870707 Date:October 27h, 2014     1.ngx_rbtree优势和特点  

@Echo· 个人技术笔记 6万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

NGINX 的源码

NGINX 的源码是一个非常经典和优秀的项目,它的设计理念、架构和代码风格都值得深入学习。我们来系统性地讲解一下 NGINX 的源码。我会从和这几个方面来为你剖析。

u011091936的博客 865

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

讲解 Ingress-NGINX 的源码

讲解 Ingress-NGINX 的源码也非常有意义。它是在我们刚才讨论的 NGINX 源码之上的一个更高层次的封装,完美地展示了如何将一个强大的数据平面(NGINX)与一个现代的控制平面(Kubernetes API)相结合。如果你已经理解了 NGINX 的基本原理,那么理解 Ingress-NGINX 会容易很多。首先,要明确 Ingress-NGINX 不是 NGINX 的一个分支或重写。它是一个独立的程序,其核心使命是:充当 Kubernetes 的 Ingress 控制器(Controller)。

u011091936的博客 1249

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

NGINX的源码安装

安装openssl-devel.x86_64。最后发现又出现了错误缺少OpenSSL。这样子证明NGINX已经安装完成了。在末尾的时候能看到这样的报错。在编译的最后面又出现错误了。启动NGINX并查看端口。查看模块是否增加成功。程序文件(注意先备份。当前新的请求仍然由旧。

weixin_68398469的博客 3319

Nginx基本数据结构

话说学习一种编程语言,例如C语言,我们首先学的也是数据结构,这是以后开发程序的关键。为了更好更方便的开发Nginx,Nginx自己实现了很多适合nginx的数据结构。 Nginx中的数组   ngx_array_s是Nginx中的数组,原型为ngx_array_t。 typedef struct { void *elts; //指

把握自己。 2204

nginx基本安全优化

提升网站安全,要从最简单、最短板、最低点的地方入手解决问题,如果门打开着,即使给窗户安装再结实的护栏也没有意义。·向有经验的人及优秀的网站公司学习。·学会看官方文档,根据第一手资料去分析。·命令输出结果中含有需要过滤或要保留的内容时,命令自身可能有参数可直接实现。

weixin_44800629的博客 6263

nginx源码学习笔记

nginx 源码学习笔记(一)——初识nginx helloworld模块 nginx 源码学习笔记(二)——nginx精粹-模块 nginx 源码学习笔记(三)——nginx精粹-模块 nginx 源码学习笔记(四)——nginx精粹-模块 nginx 源码学习笔记(五)——nginx精粹-模块 nginx 源码学习笔记(六)——nginx基本数据结构 nginx 源码学习笔记(七)——内存分配相关源码分析 nginx 源码学习笔记(八)——基本容器——array数组 nginx 源码学习笔记(九)——基

qq_23350817的博客 271

菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t

nginx 缓冲区链表的源码剖析

@Echo· 个人技术笔记 1万+
上一篇: nginx 源码学习笔记(五)——nginx精粹-模块
下一篇: nginx 源码学习笔记(六)——nginx基本数据结构
piperzero
博客等级 码龄21年 1377粉丝 504原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值