这次咱们次要来说说muduo库中大量应用的回调机制。muduo次要应用的是利用Callback的形式来实现回调,首先咱们在本人的EchoServer构造函数中有这样几行代码

    EchoServer(EventLoop *loop,            const InetAddress &addr,             const std::string &name)        : server_(loop, addr, name)        , loop_(loop)    {        // 注册回调函数        server_.setConnectionCallback(            std::bind(&EchoServer::onConnection, this, std::placeholders::_1)        );        server_.setMessageCallback(            std::bind(&EchoServer::onMessage, this,                std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)        );        // 设置适合的loop线程数量 loopthread        server_.setThreadNum(3);    }

应用了setConnectionCallbacksetMessageCallback,咱们去看下TcpServersetConnectionCallback怎么实现的

void setConnectionCallback(const ConnectionCallback &cb) { connectionCallback_ = cb; }

这样当有新的连贯建设时候,就会执行咱们设置的EchoServer::onConnection,这样咱们就给TcpServer设置了一个回调函数,同时当TcpServer中的Acceptor承受到一个新的连贯,TcpServer就会去用这个connfd和对应的peerAddr建设一个新的TcpConnection,同时TcpServer会给这个TcpConnection设置一个回调,而这个回调就是咱们给TcpServer设置的回调

    // 依据连贯胜利的sockfd,创立TcpConnection    TcpConnectionPtr conn(new TcpConnection(                            ioLoop,                            connName,                            sockfd,   // Socket Channel                            localAddr,                            peerAddr));    connections_[connName] = conn;    // 上面的回调时用户设置给TcpServer,TcpServer又设置给TcpConnection,TcpConnetion又设置给Channel,Channel又设置给Poller,Poller告诉channel调用这个回调    conn->setConnectionCallback(connectionCallback_);    conn->setMessageCallback(messageCallback_);    conn->setWriteCompleteCallback(writeCompleteCallback_);

当曾经建设的连贯有新音讯来的时候,conn->setMessageCallback(messageCallback_);这一行代码示意咱们给这个conn设置了一个有音讯来的时候回调,咱们去看下TcpConnection中对setMessageCallback是怎么解决的

    void setConnectionCallback(const ConnectionCallback& cb)    { connectionCallback_ = cb; }

所以有音讯来的时候,就会执行咱们所设置的回调函数onMessage。到这里我么就根本晓得新连贯的建设和旧连贯的音讯到来应该做什么,下一章咱们说一下音讯之间发送的Buffer类。

本人的网址:www.shicoder.top
欢送加群聊天 452380935
本文由博客一文多发平台 OpenWrite 公布!