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

相关文章

详解如何使用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 自定义

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI