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 类来建立连接。