muduo源码分析之回调模块

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 发布!

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部