【Linux】【网络】Reactor补充+Libevent

news/2025/2/22 4:52:40/

【Linux】【网络】Reactor补充+Libevent

1. 组件与类解析

1.1 句柄

IO框架库要处理的对象,即IO事件、信号和定时事件,统一称为事件源。一个事件源通常和一个句柄绑定在一起.句柄的作用是,当内核检测到就绪事件时,它将通过句柄来通知应用程序这一事件。在LINUX环境下,I/0事件对应的句柄是文件描述符,信号事件对应的句柄就是信号值。

1.2 Reactor(反应器)

  • 职责:事件循环的核心,管理和调度事件的监听、分发和处理。
  • 对应 Libeventevent_base
  • 关键函数
    • handle_events():启动事件循环并处理事件,Libevent 对应函数:event_base_dispatch(base)
    • register_handler():注册事件处理器,Libevent 对应函数:event_add(ev, timeout)
    • remove_handler():移除事件处理器,Libevent 对应函数:event_del(ev)

1.3 EventDemultiplexer(事件多路分发器)

  • 职责:封装底层 I/O 多路复用机制(如 selectpollepoll),统一接口监听事件的就绪状态
  • 对应 Libevent 实现:Libevent 内部使用 epoll(Linux)和 kqueue(BSD)等多路复用机制。
  • 关键函数
    • register_event():注册事件类型,Libevent 内部在创建事件时通过 event_new() 来设置事件类型。
    • remove_event():移除事件,Libevent 对应函数:event_del()
    • demultiplex():检测就绪事件,Libevent 内部通过 epoll_waitkqueue 等进行事件检测。

1.4 EventHandler(事件处理器)

  • 职责:定义事件处理的抽象接口,具体事件处理器需要实现该接口。
  • 对应 Libeventevent
  • 对应 Libevent 实现:回调函数。
  • 关键函数
    • get_handle():获取事件关联的句柄,Libevent 中对应 event 结构的 ev_fd 字段。
    • handle_event():处理事件的逻辑,Libevent 中对应用户自定义的回调函数,如 read_cb(evutil_socket_t fd, short events, void *arg)

1.5 ConcreteEventHandler(具体事件处理器)

  • 职责:实现 EventHandler 接口,处理具体业务逻辑。
  • 对应 Libevent 示例:回调函数(例如 read_cb)。

完整流程示例

// 1. 初始化 Reactor(event_base)
struct event_base *base = event_base_new();// 2. 创建事件处理器(如监听套接字)
evutil_socket_t listen_fd = socket(...);
struct event *listen_event = event_new(base, listen_fd, EV_READ | EV_PERSIST, accept_cb, base);// 3. 注册事件处理器
event_add(listen_event, NULL);// 4. 启动事件循环
event_base_dispatch(base);// 5. 事件触发时调用 handle_event(accept_cb)
void accept_cb(evutil_socket_t fd, short events, void *arg) {struct event_base *base = arg;evutil_socket_t client_fd = accept(fd, ...);// 创建新的 bufferevent 处理客户端数据struct bufferevent *bev = bufferevent_socket_new(base, client_fd, BEV_OPT_CLOSE_ON_FREE);bufferevent_setcb(bev, read_cb, NULL, error_cb, NULL);bufferevent_enable(bev, EV_READ);
}// 6. 具体数据处理(ConcreteEventHandler::handle_event)
void read_cb(struct bufferevent *bev, void *arg) {char buf[1024];bufferevent_read(bev, buf, sizeof(buf));// 处理数据...
}

5. 总结

  • Reactor(反应器) 是事件驱动模型的核心,Libevent 中的 event_base 对应该角色,负责调度事件循环
  • EventDemultiplexer(事件多路分发器) 底层封装多路复用机制(如 epoll),用于检测事件是否就绪
  • EventHandler(事件处理器)ConcreteEventHandler处理事件的抽象和具体实现,Libevent 中对应回调函数的处理逻辑。
    在这里插入图片描述
    在这里插入图片描述

http://www.ppmy.cn/news/1574057.html

相关文章

本地部署DeepSeek的硬件配置建议

本地部署DeepSeek的硬件配置需求因模型参数规模和部署工具不同而有所差异,以下是综合多个来源的详细要求: 1. 基础配置(适用于7B参数模型) 内存:最低8GB,推荐16GB及以上;若使用Ollama工具&…

【2025最新版】Chrome谷歌浏览器如何能恢复到之前的旧版本

背景 今天程序突然出了bug,无法自动测试了,显示Chrome版本不匹配,一看,Chrome居然在我已经关闭升级的情况下,又给我升级了,然后就悲剧了,我的代码不能用了。 于是,做了以下几步&…

创客匠人:知识服务还有未来吗?个人IP如何突围下半场的生死局?

我是老蒋,创客匠人创始人。 最近各种对个人IP赛道的预测,我听了不少,打开手机就是对个人IP的一顿喷和对行业未来的悲观猜想。 当所有人都在唱衰知识服务赛道时,我却在公司的后台数据看到令人振奋的消息: 2025年创客…

Linux sftp 使用详解

简介 SFTP(安全文件传输协议)是一种通过网络在计算机之间传输文件的安全方法。它是 SSH 协议的一部分,这意味着它在文件传输过程中提供加密通信。SFTP 通常用于安全文件管理、远程文件访问和远程文件编辑。 常用命令 sftp userhost&#xf…

Linux 固定 IP 地址和网关

Linux 固定 IP 地址和网关 查看 IP ifconfig ifconfig eth0 ip addr ip addr show eth0 查看网关 ip route show route -n netstat -rn 设置固定 IP // 配置静态IP文件/etc/network/interfaces $ vi /etc/network/interfacesauto eth0 iface eth0 inet static addre…

python查错误TypeError: bad operand type for unary -: ‘str‘

TypeError: bad operand type for unary -: str​​​ 这个错误表明尝试对一个字符串类型的数据使用一元减号运算符(​​-​​),而在 Python 中,一元减号运算符只能用于数值类型(如整数、浮点数等)&#xf…

style.cssText用法

style.cssText 是一种在 JavaScript 中直接操作 DOM 元素的样式属性的方法。它允许你通过一次赋值操作来设置或修改一个元素的所有 CSS 样式,而不是逐个设置样式属性。 使用方法 假设你有一个 HTML 元素,并且你想通过 JavaScript 来设置它的多个 CSS 样…

Redis(高阶篇)02章——BigKey

一、面试题 阿里广告平台,海量数据里查询某一个固定前缀的key小红书,你如何生产上限制 keys* /flushdb/flushall等危险命令以防止阻塞或误删数据?美团,memory usage命令你用过吗?BigKey问题,多大算big&…