1. Acceptor模块设计与实现
在网络编程中,Acceptor模块是服务器端处理新连接请求的核心组件。它负责监听指定端口,接受客户端连接,并将新连接分发给上层处理模块。下面我们详细解析一个基于事件驱动的Acceptor实现。
1.1 核心功能解析
Acceptor模块主要承担四项关键职责:
-
套接字创建与绑定:在构造函数中完成监听套接字的创建、绑定和监听操作。这里使用了一个封装好的Socket类,其CreateServer方法内部已经处理了socket()、bind()和listen()等系统调用。
-
事件监控设置:通过Channel类将监听套接字注册到事件循环(EventLoop)中,关注读事件(EPOLLIN)。当有新连接到达时,内核会通知事件循环。
-
连接接受处理:在HandleRead回调中调用accept()系统调用获取新连接。这里需要注意错误处理,特别是当accept返回EAGAIN或EWOULDBLOCK时的重试逻辑。
-
连接分发机制:通过回调函数将新连接的文件描述符传递给上层模块。这种设计实现了Acceptor与连接管理的解耦,符合单一职责原则。
关键点:Acceptor只负责接受连接,不参与连接后续的数据传输管理,这种职责划分使得代码结构更清晰,各模块耦合度更低。
1.2 关键代码实现
让我们深入分析核心代码实现细节:
cpp复制class Acceptor {
private:
Socket _socket; // 监听套接字封装
EventLoop* _loop; // 所属事件循环
Channel _channel; // 事件通道
using AcceptCallback = std::function<void(int)>;
AcceptCallback _accept_callback;
void HandleRead() {
int newfd = _socket.Accept();
if (newfd < 0) return;
if (_accept_callback) _accept_call
