IO多路转接之Reactor
2025-8-28
| 2025-8-29
Words 3939Read Time 10 min
type
status
date
slug
summary
tags
category
icon
password

IO多路转接之Reactor

epoll的工作模式有两种,一种默认LT工作模式,另一种是ET模式。关于epoll的LT工作模式我们已经写过了。接下来我们写一份基于ET模式下的Reator,处理所有的IO。
Reactor = 如何正确的处理IO+协议定制+业务逻辑处理
下面我们写一个Reactor,它是一个半同步半异步IO,Reactor是在Liunx网络中,最常用,最频繁的一种网络IO设计模式!

准备工作

Logger.hpp

lockGuard.hpp

InetAddr.hpp

Socket.hpp

计算、解析

Calculator.hpp

Protocol.hpp

Parser.hpp

Reactor实现

Util.hpp

Connection.hpp

Listener.hpp

channel.hpp

Epoller.hpp

Reactor.hpp

Main.cc

Client.cc

makefile

如果想把这个服务器改成多多进程多线程,其实可以直接创建多进程,每个进程里都搞一个TcpServer,或者说创建多线程,每一个线程里都搞一个Tcpserver,把_listensock套接字添加到其中一个线程的Reactor里,一旦有连接就绪的时候,不是要执行Accepter吗,执行Accepter的时候就不仅仅是 AddConnection了,而是尝试把这个连接添加到哪一个线程的epoll中, 然后就在这个线程里把这个文件描述符处理完。
还可以在Connectoin中设置一个lasttime记录最近访问时间,每一次读或写的时候我们都更新一个对应时间戳,所以只要读或写就绪了就可以更新一下对应Connection最近时间,换句话说此时我们就可以在派发事件后当所有事件处理完了,就可以在unordered_map遍历所有的连接,计算每一个连接已经有多长时间没有动了,因为每一个连接都有自己的最近访问时间,每一次访问都会更新,不更新就是最开始的,所以我们可以获取当前时间在减去Connectoin里保存的历史最近访问时间,计算出时间差,然后就可以所以连接进行连接管理。时间超过5分钟都没有访问过的,服务器就直接把你关掉。
  • Linux
  • IO多路转接之epollLinux项目自动化构建工具之make_Makefile
    Loading...