乐趣区

关于golang:muduo源码分析之回调模块

这次咱们次要来说说 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 公布!

退出移动版