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

ngx_http_cmp_conf_addrs

1 定义

ngx_http_cmp_conf_addrs 函数 定义在 ./nginx-1.24.0/src/http/ngx_http.c
staticngx_int_tngx_http_cmp_conf_addrs(constvoid*one,constvoid*two){ngx_http_conf_addr_t*first,*second;first=(ngx_http_conf_addr_t*)one;second=(ngx_http_conf_addr_t*)two;if(first->opt.wildcard){/* a wildcard address must be the last resort, shift it to the end */return1;}if(second->opt.wildcard){/* a wildcard address must be the last resort, shift it to the end */return-1;}if(first->opt.bind&&!second->opt.bind){/* shift explicit bind()ed addresses to the start */return-1;}if(!first->opt.bind&&second->opt.bind){/* shift explicit bind()ed addresses to the start */return1;}/* do not sort by default */return0;}
`ngx_http_cmp_conf_addrs` 是 Nginx 用于 对 HTTP 监听地址(`listen` 配置解析结果)进行优先级排序的比较回调函数。 它按照 `显式 bind 的地址` → `普通明确 IP 地址` → `通配符地址(如 0.0.0.0/::)` 的规则重排地址数组。 核心作用: 确保精确 IP 优先绑定与匹配,避免底层端口冲突; 同时将通配符地址强制置末作为兜底(`default_server`), 从而提升新连接的路由匹配效率并保障虚拟主机配置语义的正确性。

2 详解

1 函数签名

staticngx_int_tngx_http_cmp_conf_addrs(constvoid*one,constvoid*two)
返回值 负值(如 -1):表示 one 小于 two 零:表示 one 和 two 相等 正值(如 1):表示 one 大于 two
参数 const void *one, const void *two 当前正在比较的两个元素

2 逻辑流程

1 局部变量 2 比较

1 局部变量
{ngx_http_conf_addr_t*first,*second;first=(ngx_http_conf_addr_t*)one;second=(ngx_http_conf_addr_t*)two;
强制类型转换, 转换为具体类型才能够访问其成员字段

2 比较
if(first->opt.wildcard){/* a wildcard address must be the last resort, shift it to the end */return1;}if(second->opt.wildcard){/* a wildcard address must be the last resort, shift it to the end */return-1;}if(first->opt.bind&&!second->opt.bind){/* shift explicit bind()ed addresses to the start */return-1;}if(!first->opt.bind&&second->opt.bind){/* shift explicit bind()ed addresses to the start */return1;}/* do not sort by default */return0;}
#1 所有非通配符地址排在通配符地址之前 #2 在非通配符地址内部,有 bind 标志的地址优先于无 bind 标志的地址 #3 其他情况视为相等,不交换顺序
http://www.jsqmd.com/news/598990/

相关文章:

  • Ubuntu22.04下ibus键盘延时与终端光标消失的根治方案
  • 柔性作业车间调度(FJSP)实战指南:如何应对多机器选择的挑战
  • Day23 | 组合总和、组合总和Ⅱ、分割回文串
  • C# WinForm图书管理系统(含完整报告)|基于SQL Server三层架构的图书信息增删改查解决方案
  • Go Context 信号传播机制与取消任务设计
  • 《为什么90%的数字孪生都是假的?》
  • **MQTT协议实战:从零搭建轻量级物联网消息中间件系统**在当前万物互联的时代,**MQ
  • 从‘局部线性模型’到代码:拆解引导滤波(Guided Filter)的数学之美与工程实现
  • Win10/Win11远程桌面报错‘函数不受支持’?5分钟搞定CredSSP加密Oracle修正
  • C++标准库里为什么没有网络库?
  • SeaweedFS高可用集群部署实战
  • 淨界法師 :有福報的人講話厚道,不會傷人,他處處為別人著想
  • 亚马逊德国站VAT发票自动筛选:手把手教你用浏览器控制台JS代码搞定(附Edge/Chrome/Firefox全版本)
  • 安卓党狂喜!纯净无广 BT/磁力/HTTP/FTP满速下载
  • 如何快速将网页转换为Figma设计稿:5分钟完成HTML到Figma的无缝转换
  • 2025届最火的六大AI辅助写作工具推荐榜单
  • 金融级权限设计实战:用RBAC3模型搞定互斥角色、基数限制与操作审计
  • 上午算法相关—计算机等级考试—软件设计师考前备忘录—东方仙盟
  • AI时代传统程序员是否会被替代?深入剖析篇章一
  • 《港口三维空间智能系统完整方案》——从“看不清”到“全域掌控”,港口进入空间智能时代
  • 2025届毕业生推荐的降重复率神器解析与推荐
  • 10、Ansible 生产级故障排查与运维最佳实践
  • 喜马拉雅VIP音频下载器:3分钟学会离线保存付费有声小说
  • Anaconda3新建环境也卡solving?可能是你的Conda版本和镜像源该更新了
  • 9. C++14新特性-std::tuple 的按类型寻址 (Type-based Tuple Addressing)
  • 专业级批量二维码扫描工具V2.0|高精度图片二维码批量识别软件
  • 比亚迪3月销量突破30万辆,获中国新能源车企销量冠军
  • 哈希表入门教程:从零搭建完整结构
  • crypto-js —— 前端数据安全的 JavaScript 加密利器
  • IP-vlan实验报告