Squid Epoll网络模型

2024-02-07 19:18
文章标签 模型 网络 epoll squid

本文主要是介绍Squid Epoll网络模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Squid Epoll网络模型

Squid 历经2.x, 3.x,官网已经有正在开发中的4.0版本。
Squid如今以20万行风骚代码让码农们找不着北了,本文就以Squid-4.0.0的源码为例吐槽一下。Squid编译时可以根据OS自动选择支持的网络模型,对网络的支持最终会编译到ModEpoll.cc、
ModKqueue.cc、ModPoll.cc、ModSelect.cc。这些文件针对不同网络都有实现,
最终导出几个公共函数SelectLoopInit、SetSelect、ResetSelect、DoSelect。

风骚的SetSelect

SetSelect(int fd, unsigned int type, PF * handler, void *client_data, time_t timeout)// If read is an interestif (type & COMM_SELECT_READ) {if (handler) {// Hack to keep the events flowing if there is data immediately readyif (F->flags.read_pending)ev.events |= EPOLLOUT;ev.events |= EPOLLIN;}F->read_handler = handler;F->read_data = client_data;// Otherwise, use previously stored value} else if (F->epoll_state & EPOLLIN) {ev.events |= EPOLLIN;}// If write is an interestif (type & COMM_SELECT_WRITE) {if (handler)ev.events |= EPOLLOUT;F->write_handler = handler;F->write_data = client_data;// Otherwise, use previously stored value} else if (F->epoll_state & EPOLLOUT) {ev.events |= EPOLLOUT;}if (ev.events)ev.events |= EPOLLHUP | EPOLLERR;if (ev.events != F->epoll_state) {if (F->epoll_state) // already monitoring something.epoll_ctl_type = ev.events ? EPOLL_CTL_MOD : EPOLL_CTL_DEL;elseepoll_ctl_type = EPOLL_CTL_ADD;F->epoll_state = ev.events;
根据SetSelect设置的读写类型Read或者Write保留其它事件不变,
从而达到每次只改变需要设置的事件回调。最终根据ev.events的值判断
是否需要Mod或者Del。

吊的不行的DoSelect

        if (cevents->events & (EPOLLIN|EPOLLHUP|EPOLLERR) || F->flags.read_pending) {if ((hdl = F->read_handler) != NULL) {debugs(5, DEBUG_EPOLL ? 0 : 8, HERE << "Calling read handler on FD " << fd);PROF_start(comm_write_handler);F->flags.read_pending = 0;F->read_handler = NULL;hdl(fd, F->read_data);PROF_stop(comm_write_handler);++ statCounter.select_fds;} else {debugs(5, DEBUG_EPOLL ? 0 : 8, HERE << "no read handler for FD " << fd);// remove interest since no handler exist for this event.SetSelect(fd, COMM_SELECT_READ, NULL, NULL, 0);}}if (cevents->events & (EPOLLOUT|EPOLLHUP|EPOLLERR)) {if ((hdl = F->write_handler) != NULL) {debugs(5, DEBUG_EPOLL ? 0 : 8, HERE << "Calling write handler on FD " << fd);PROF_start(comm_read_handler);F->write_handler = NULL;hdl(fd, F->write_data);PROF_stop(comm_read_handler);++ statCounter.select_fds;} else {debugs(5, DEBUG_EPOLL ? 0 : 8, HERE << "no write handler for FD " << fd);// remove interest since no handler exist for this event.SetSelect(fd, COMM_SELECT_WRITE, NULL, NULL, 0);}}
每次执行完回调后handler = NULL,epoll在该套接字下一次事件中
SetSelect(fd, COMM_SELECT_WRITE, NULL, NULL, 0)将该套接字删除,
所以如果还想继续监听套接字事件必需在回调函数中手动执行SetSelect。

提取的Epoll模型
感受到Squid的如此强大,不由自主的提取了框架并做了一个小Demo。
顺便献上git地址https://github.com/strong46066999/epoll。

这篇关于Squid Epoll网络模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/688665

相关文章

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义