当前位置: 首页 > article >正文

ngx_create_listening

1 定义ngx_create_listening 函数 定义在 ./nginx-1.24.0/src/core/ngx_connection.cngx_listening_t*ngx_create_listening(ngx_conf_t*cf,structsockaddr*sockaddr,socklen_tsocklen){size_tlen;ngx_listening_t*ls;structsockaddr*sa;u_char text[NGX_SOCKADDR_STRLEN];lsngx_array_push(cf-cycle-listening);if(lsNULL){returnNULL;}ngx_memzero(ls,sizeof(ngx_listening_t));sangx_palloc(cf-pool,socklen);if(saNULL){returnNULL;}ngx_memcpy(sa,sockaddr,socklen);ls-sockaddrsa;ls-socklensocklen;lenngx_sock_ntop(sa,socklen,text,NGX_SOCKADDR_STRLEN,1);ls-addr_text.lenlen;switch(ls-sockaddr-sa_family){#if(NGX_HAVE_INET6)caseAF_INET6:ls-addr_text_max_lenNGX_INET6_ADDRSTRLEN;break;#endif#if(NGX_HAVE_UNIX_DOMAIN)caseAF_UNIX:ls-addr_text_max_lenNGX_UNIX_ADDRSTRLEN;len;break;#endifcaseAF_INET:ls-addr_text_max_lenNGX_INET_ADDRSTRLEN;break;default:ls-addr_text_max_lenNGX_SOCKADDR_STRLEN;break;}ls-addr_text.datangx_pnalloc(cf-pool,len);if(ls-addr_text.dataNULL){returnNULL;}ngx_memcpy(ls-addr_text.data,text,len);#if!(NGX_WIN32)ngx_rbtree_init(ls-rbtree,ls-sentinel,ngx_udp_rbtree_insert_value);#endifls-fd(ngx_socket_t)-1;ls-typeSOCK_STREAM;ls-backlogNGX_LISTEN_BACKLOG;ls-rcvbuf-1;ls-sndbuf-1;#if(NGX_HAVE_SETFIB)ls-setfib-1;#endif#if(NGX_HAVE_TCP_FASTOPEN)ls-fastopen-1;#endifreturnls;}ngx_create_listening 函数的作用是 在 Nginx 配置解析阶段 将 listen 指令解析出的网络地址信息实例化为 ngx_listening_t 结构体 并注册到全局监听列表中为后续统一创建实际 socket 做数据准备2 详解1 函数签名ngx_listening_t*ngx_create_listening(ngx_conf_t*cf,structsockaddr*sockaddr,socklen_tsocklen)返回值 成功时返回新创建并初始化完成的 ngx_listening_t 对象指针。 失败时返回 NULL参数 ngx_conf_t *cf 指向配置解析上下文 struct sockaddr *sockaddr 传入的需要监听的地址信息 socklen_t socklen 前一个参数的 地址结构的实际字节长度2 逻辑流程1 局部变量 2 创建监听管理对象 3 设置结构体的各个字段 4 返回监听管理对象指针1 局部变量{size_tlen;ngx_listening_t*ls;structsockaddr*sa;u_char text[NGX_SOCKADDR_STRLEN];2 创建监听管理对象lsngx_array_push(cf-cycle-listening);if(lsNULL){returnNULL;}ngx_memzero(ls,sizeof(ngx_listening_t));#1 向 Nginx 全局的“监听数组”cycle-listening 中追加一个空元素 并返回指向该新元素的指针赋值给局部变量 ls。 #2 将新追加的 ngx_listening_t 结构体所占内存区域全部清零每个字节设为 0。3 设置结构体的各个字段sangx_palloc(cf-pool,socklen);if(saNULL){returnNULL;}ngx_memcpy(sa,sockaddr,socklen);#1 从配置解析阶段的内存池 cf-pool 中分配一块大小为 socklen 字节的内存 并将指向这块内存的指针赋值给局部变量 sa。 #2 将传入的 sockaddr 指针所指向的 socklen 字节数据 完整拷贝到新分配的 sa 内存中 为 sockaddr 内容创建一个独立的副本 而不是直接保存传入的 sockaddr 指针ls-sockaddrsa;ls-socklensocklen;将之前分配并拷贝好的套接字地址结构及其长度 赋值给监听管理对象 ls 的对应成员使 ls 正式拥有完整的地址信息。lenngx_sock_ntop(sa,socklen,text,NGX_SOCKADDR_STRLEN,1);ls-addr_text.lenlen;将二进制套接字地址 sa 转换为人类可读的字符串形式 并将该字符串存入缓冲区 text 中同时返回实际写入的字符串长度不含终止符switch(ls-sockaddr-sa_family){#if(NGX_HAVE_INET6)caseAF_INET6:ls-addr_text_max_lenNGX_INET6_ADDRSTRLEN;break;#endif#if(NGX_HAVE_UNIX_DOMAIN)caseAF_UNIX:ls-addr_text_max_lenNGX_UNIX_ADDRSTRLEN;len;break;#endifcaseAF_INET:ls-addr_text_max_lenNGX_INET_ADDRSTRLEN;break;default:ls-addr_text_max_lenNGX_SOCKADDR_STRLEN;break;}根据监听地址的协议族sa_family 设置监听对象 ls 的 addr_text_max_len 字段地址文本缓冲区的最大所需长度 并且在 Unix 域套接字的情况下对 len 进行修正len。 addr_text_max_len 用于指示将来存储该地址字符串时 缓冲区应预留的最大字符数包括可能的端口、括号等格式化字符。#1 将 addr_text_max_len 设为适合 IPv6 地址文本的最大长度 NGX_INET6_ADDRSTRLEN Nginx 定义的宏表示 IPv6 地址字符串表示的最大长度#2 设置最大长度为 Unix 域路径的最大值 并调整当前实际长度 len 使其增加 1。 NGX_UNIX_ADDRSTRLEN Nginx 定义的 Unix 域套接字路径最大长度 len 增加之前通过 ngx_sock_ntop 得到的地址文本长度。 为什么要 len 对于 Unix 域套接字ngx_sock_ntop 返回的 len 通常只是路径字符串的长度不包含终止符#3 将 addr_text_max_len 设为适合 IPv4 地址文本的最大长度 NGX_INET_ADDRSTRLEN Nginx 定义的 IPv4 地址字符串最大长度#4 默认分支 如果遇到未知的地址族 则使用一个通用最大长度 NGX_SOCKADDR_STRLEN通常定义为足够容纳任何地址的较大值) 保证 addr_text_max_len 总是被赋予一个合理值避免未初始化。ls-addr_text.datangx_pnalloc(cf-pool,len);if(ls-addr_text.dataNULL){returnNULL;}ngx_memcpy(ls-addr_text.data,text,len);为监听对象 ls 的地址文本字符串addr_text.data分配恰好能容纳 len 字节的内存 并将之前生成的地址文本存放在临时缓冲区 text 中拷贝到这块内存中 完成地址文本的持久化存储。#if!(NGX_WIN32)ngx_rbtree_init(ls-rbtree,ls-sentinel,ngx_udp_rbtree_insert_value);#endif这段代码 是 Nginx 为 UDP 无连接协议实现用户态会话跟踪 的核心初始化逻辑。 它通过在监听结构体中嵌入一棵红黑树 将“无状态”的 UDP 数据流抽象为“有状态”的会话模型。 会话状态容器初始化 为当前监听端口创建一棵空的红黑树 用于动态记录该端口上的 UDP “伪连接”源 IP:端口 ↔ 目的 IP:端口。 平台差异化屏蔽 通过 #if !(NGX_WIN32) 排除 Windows 平台 仅在该机制完整支持且架构匹配的类 Unix 系统上编译。 为后续事件循环提供查找基石 初始化后Worker 进程在收到 UDP 数据包时 可通过此树快速匹配会话节点ls-fd(ngx_socket_t)-1;ls-typeSOCK_STREAM;ls-backlogNGX_LISTEN_BACKLOG;ls-rcvbuf-1;ls-sndbuf-1;#if(NGX_HAVE_SETFIB)ls-setfib-1;#endif#if(NGX_HAVE_TCP_FASTOPEN)ls-fastopen-1;#endif对 ngx_listening_t 结构体中尚未设置的关键成员进行默认值初始化 确保监听对象处于已知、安全的状态4 返回监听管理对象指针returnls;}

相关文章:

ngx_create_listening

1 定义 ngx_create_listening 函数 定义在 ./nginx-1.24.0/src/core/ngx_connection.cngx_listening_t * ngx_create_listening(ngx_conf_t *cf, struct sockaddr *sockaddr,socklen_t socklen) {size_t len;ngx_listening_t *ls;struct sockaddr *sa;u_char …...

如何通过多平台同步推流提升直播效率?开源工具obs-multi-rtmp的全场景应用指南

如何通过多平台同步推流提升直播效率?开源工具obs-multi-rtmp的全场景应用指南 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 在直播行业蓬勃发展的今天,内容创…...

C++20 中的协程与异步 I/O:探索高效编程新路径

C20 中的协程与异步 I/O:探索高效编程新路径 在 C 的发展历程中,每一次标准的更新都为开发者带来了新的特性和工具,以提升代码的性能、可读性和开发效率。C20 作为一次重要的更新,引入了协程这一强大的特性,它与异步 I…...

C++编程中的死锁分析与预防策略

C编程中的死锁分析与预防策略 在C多线程编程的世界里,死锁是一个常见且棘手的问题。它如同交通中的十字路口堵塞,让程序的多个线程陷入无限等待,无法继续执行,进而影响程序的性能和稳定性。本文将深入探讨C中死锁的产生原因&#…...

INS与GPS组合导航EKF算法代码功能说明

三维的组合导航。 ins和卫星的组合导航算法,基于卡尔曼滤波和eskf滤波的都有。 MATLAB源码,有kf和eskf的对比,也有单独的误差,或者输入滤波之后的位移速度等导航参数。 这段程序主要是一个卡尔曼滤波器,用于估计运动物…...

架构实战:基于海事网关实现老旧船舶 OT 系统的安全上行与协议转换

摘要: 本文针对老旧船舶数字化改造中“资产利旧”与“合规安全”的双重挑战,深度拆解利用边缘计算能力打通传统串口到 海事网络设备管理平台(RCMS Stack Marine) 加密通道的技术细节。重点涵盖 Python 协议重构、离线缓冲与符合 I…...

深度解析Windows驱动管理:DriverStore Explorer高效清理冗余驱动实战指南

深度解析Windows驱动管理:DriverStore Explorer高效清理冗余驱动实战指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer DriverStore Explorer(简称RAPR&#x…...

手机摄影党必看!用Flare7K数据集原理改善夜间拍摄(华为/iPhone实测)

手机摄影党必看!用Flare7K数据集原理改善夜间拍摄(华为/iPhone实测) 夜间拍摄时,你是否经常遇到这样的困扰:路灯变成模糊的光团,霓虹灯周围出现奇怪的彩虹条纹,或是画面中突然多出几条不明来源的…...

【EI复现】【基于改进粒子群算法求解】一种建筑集成光储系统规划运行综合优化方法附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…...

研发效能工具选型:8 款主流敏捷研发管理平台优缺点

本文将深入对比8款敏捷研发管理工具:PingCode、Worktile、LigaAI、飞项、码云 Gitee Enterprise、进度猫、事井然、tita项目管理 在研发效能(DevOps)日益受重视的今天,选择一款合适的敏捷管理工具已成为企业提升竞争力的关键。随着…...

C++ 与 异步流调度:在 C++ AI 框架中利用多个 CUDA Stream 重叠计算与数据传输的掩盖性能分析

C 与 异步流调度:在 C AI 框架中利用多个 CUDA Stream 重叠计算与数据传输的掩盖性能分析引言在现代人工智能领域,尤其是深度学习的应用中,GPU 已成为不可或缺的计算引擎。然而,即使拥有强大的 GPU 算力,系统整体性能也…...

【Linux基础】文件编辑压缩解压

文件编辑&&压缩解压 实验环境准备 [rootCentOS-Harvy /]# cd tmp/ [rootCentOS-Harvy tmp]# mkdir -p lab_319[rootCentOS-Harvy tmp]# ll | grep *319 drwxr-xr-x. 2 root root 6 3月 19 16:59 lab_319实验1:Vim 文本编辑 1.1 创建文件并写入内容…...

Axure RP本地化技术指南:从英文界面到全中文工作流

Axure RP本地化技术指南:从英文界面到全中文工作流 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 诊断界面本地化痛…...

Redis 只会用缓存?16种妙用让同事直呼牛X

1、缓存String 类型例如:热点数据缓存(例如报表、明星出轨),对象缓存、全页缓存、可以提升热点数据的访问数据。2、数据共享分布式String 类型,因为 Redis 是分布式的独立服务,可以在多个应用之间共享例如&…...

Vivado收费IP核怎么选?从以太网到视频接口,这份避坑指南帮你省下冤枉钱

Vivado收费IP核选型实战指南:从以太网到视频接口的避坑策略 在FPGA项目开发中,IP核的选择往往决定了整个项目的成败。面对Vivado中琳琅满目的收费IP核,工程师们常常陷入两难:既要确保功能完备,又要控制成本。本文将带你…...

考虑需求响应的微网优化调度MATLAB程序:基于粒子群算法,包含风力、光伏、储能等多主体模块化...

考虑需求响应的微网优化调度matlab 程序采用粒子群算法,风力发电机、光伏发电机、储能装置、燃气轮机、柴油机组等主体,考虑负荷需求响应、soc约束等,程序模块化编程,注释清楚,有对应资料概述 本文介绍了一套基于粒子群…...

跑不出密码别怪字典!实战解析Kali Linux中aircrack-ng跑包效率提升的5个关键技巧

跑不出密码别怪字典!实战解析Kali Linux中aircrack-ng跑包效率提升的5个关键技巧 当你盯着终端里aircrack-ng跑包的进度条,看着它缓慢地遍历字典却始终无法命中正确密码时,那种挫败感每个渗透测试者都深有体会。但问题真的出在字典上吗&…...

基于Matlab Simulink的单相PWM整流器仿真模型:全桥整流,电压电流PI双闭环控制...

单相PWM整流器仿真模型 单相全桥整流 电压电流PI双闭环 输出电压可调 输入交流220V/50Hz,输出直流电压可调 Maltab/simulink玩过电力电子的老铁们肯定对PWM整流器不陌生。今天咱们来撸一个单相全桥PWM整流器的Simulink仿真,支持输出电压连续可调的那种。先上张主电…...

告别默认丑样式!手把手教你用WPF的ControlTemplate打造高颜值TreeView(附完整XAML代码)

从零打造高颜值WPF TreeView:深度定制ControlTemplate实战指南 每次打开Visual Studio新建WPF项目时,看到那个灰头土脸的默认TreeView控件,总有种说不出的失落感。作为数据展示的核心控件之一,TreeView在文件浏览器、配置面板、数…...

告别Steam清单配置烦恼:Onekey智能配置工具的优雅解决方案

告别Steam清单配置烦恼:Onekey智能配置工具的优雅解决方案 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 作为游戏开发者或资深玩家,你是否曾因Steam游戏清单配置而头疼…...

319嵌入式

1.关于lcd的时序图,为什么读操作时,vaild data在E拉高后,而写操作vaild data 在E拉高前写操作:数据必须在 E 上升沿之前稳定(因为 LCD 要”有效采样”) 读操作:数据在 E 拉高之后才有效&#xf…...

Python MCP模板的“最后一公里”难题:K8s ServiceMesh集成、gRPC透明代理、证书自动轮转——全链路演示

第一章:Python MCP模板的企业级定位与架构全景Python MCP(Model-Controller-Plugin)模板并非通用Web框架的变体,而是专为企业级中台系统设计的可扩展服务骨架。它聚焦于解耦业务模型、控制逻辑与插件化能力扩展,适用于…...

电商客服效率翻倍秘籍:RexUniNLU零样本抽取订单关键信息实战

电商客服效率翻倍秘籍:RexUniNLU零样本抽取订单关键信息实战 1. 电商客服的痛点与解决方案 电商客服每天面对海量用户咨询,其中订单查询类问题占比高达40%以上。传统处理方式存在三大痛点: 人工处理效率低:客服需要反复询问订单…...

AI Agent的上下文窗口限制突破技巧

AI Agent的上下文窗口限制突破技巧 关键词:AI Agent, 上下文窗口, 大型语言模型, 记忆管理, 向量数据库, 提示工程, 检索增强生成 摘要:随着AI Agent在各个领域的广泛应用,上下文窗口限制已成为制约其能力发展的关键瓶颈。本文将深入探讨AI Agent上下文窗口限制的本质问题,…...

避坑!这些毕设太好抄了,3000+毕设案例推荐第1038期

381、基于Java的对外公告智慧管理系统的设计与实现(论文+代码+PPT)对外公告智慧管理系统主要功能包括:会员管理、公告管理、审核任务、审核节点、审核日志、回复管理、通知管理、通知接收者、工作流管理、组织机构、消息推送、消息推送接收者…...

车载Linux环境下C++信号处理崩溃频发?一线团队紧急封存的6条SIGSEGV防御清单,已拦截17起量产事故

第一章:车载Linux环境下C信号处理崩溃的典型现象与量产影响在车载Linux系统中,C应用常因信号处理不当引发不可恢复的崩溃,尤其在ASIL-B及以上安全等级的ECU中,此类问题可能直接导致功能降级或安全机制误触发。典型现象包括&#x…...

告别重复编码:用快马平台内置codex服务高效生成日常开发代码片段

今天想和大家分享一个提升开发效率的实用技巧——如何利用智能工具告别重复编码的烦恼。作为开发者,我们每天都要写大量重复的样板代码,比如创建数据类、编写单元测试模板、定义React组件等。这些工作虽然简单,但累积起来会消耗大量时间。 传…...

告别重复编码:用快马AI为你的.NET项目自动生成高效工具类与模板

今天想和大家分享一个.NET开发中的效率提升小技巧——如何用自动化工具快速生成常用工具类代码。作为一个经常需要重复编写类似功能的后端开发者,我发现合理使用代码生成工具可以节省大量时间,让我们把精力集中在更有价值的业务逻辑上。 分页响应类的设…...

JAVA面试-JVM内存结构详解

Java虚拟机(JVM)内存结构,也称内存模型,是程序运行时的数据存储区域。根据《Java虚拟机规范》,可划分为线程私有和线程共享两大部分,以实现高效的内存管理和线程安全。其主要构成如下表所示: 内…...

使用 winget 卸载 SQLiteStudio:从命令到细节的完整指南

一条命令安装,一条命令卸载——winget 让 Windows 软件管理变得前所未有的简单 前言 SQLiteStudio 是一款轻量、跨平台的 SQLite 数据库管理工具,因其简洁的界面和强大的功能,深受开发者喜爱。在 Windows 上,越来越多的人选择通过微软官方包管理器 winget 来安装它: win…...