Acceptor 定义 链接到标题
这里我的理解就是,一个 Acceptor 对应一个 EventLoop,当然也有一个独有 Channel,负责分发到对应的 epoll。
这里实际上是从 Server 中又分离出了一个 Acceptor,负责管理事件循环,服务器 socket 的创建与绑定,listen,同时由 Acceptor 来负责建立连接(逻辑上),调用的底层的建立连接的函数还是 Server::NewConn(Socket *)
。
即实际上,Acceptor 类接管了之前 Server 类的工作。
Acceptor::Acceptor(EventLoop *loop) :
loop_(loop), sock_(nullptr), accept_ch_(nullptr), addr_(nullptr) {
sock_ = new Socket();
addr_ = new InetAddress("127.0.0.1", 8888);
sock_->Bind(addr_);
sock_->Listen();
sock_->Setnonblocking();
accept_ch_ = new Channel(loop_, sock_->getfd());
std::function<void()> callback = [this] {
AcceptConn();
};
accept_ch_->set_callback(callback);
accept_ch_->EnableReading();
}
void Acceptor::AcceptConn() {
new_conn_callback_(sock_);
}
void Acceptor::set_new_conn_callback(std::function<void(Socket *)> &callback) {
new_conn_callback_ = callback;
}
Server::Server(EventLoop *loop) :
loop_(loop), acceptor_(nullptr) {
acceptor_ = new Acceptor(loop);
std::function<void(Socket *)> callback = [this](auto &&PH1) { NewConn(std::forward<decltype(PH1)>(PH1)); };
acceptor_->set_new_conn_callback(callback);
}
其中以下两行代码就是让 Acceptor 类可以调用 Server 类中的 NewConn
的关键:
std::function<void(Socket *)> callback = [this](auto &&PH1) { NewConn(std::forward<decltype(PH1)>(PH1)); };
acceptor_->set_new_conn_callback(callback);
重申一遍,逻辑上由 Acceptor 类负责接受连接,但是底层还是由 Server 类来建立连接。