这次我们主要来说说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线程数量 loopthreadserver_.setThreadNum(3);}

使用了setConnectionCallbacksetMessageCallback,我们去看下TcpServersetConnectionCallback怎么实现的

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

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

    // 根据连接成功的sockfd,创建TcpConnectionTcpConnectionPtr conn(new TcpConnection(ioLoop,connName,sockfd,   // Socket ChannellocalAddr,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 发布!

muduo源码分析之回调模块相关推荐

  1. muduo源码分析之TcpServer模块

    这次我们开始muduo源代码的实际编写,首先我们知道muduo是LT模式,Reactor模式,下图为Reactor模式的流程图[来源1] 然后我们来看下muduo的整体架构[来源1] 首先muduo有 ...

  2. elasticsearch源码分析之search模块(client端)

    elasticsearch源码分析之search模块(client端) 注意,我这里所说的都是通过rest api来做的搜索,所以对于接收到请求的节点,我姑且将之称之为client端,其主要的功能我们 ...

  3. elasticsearch源码分析之search模块(server端)

    elasticsearch源码分析之search模块(server端) 继续接着上一篇的来说啊,当client端将search的请求发送到某一个node之后,剩下的事情就是server端来处理了,具体 ...

  4. FreeCAD源码分析:FreeCADGui模块

    FreeCAD源码分析:FreeCADGui模块 济南友泉软件有限公司 FreeCADGui项目实现了界面操作.模型显示与交互等相关功能,项目构建生成FreeCAD(_d).dll动态链接库. Fre ...

  5. Python3.5源码分析-内建模块builtins初始化

    Python3源码分析 本文环境python3.5.2. 参考书籍<<Python源码剖析>> python官网 Python3模块初始化与加载 Python的模块分为内建的模 ...

  6. dubbo源码分析系列——dubbo-cluster模块源码分析

    2019独角兽企业重金招聘Python工程师标准>>> 模块功能介绍 该模块的使用介绍请参考dubbo官方用户手册如下章节内容. 集群容错 负载均衡 路由规则 配置规则 注册中心参考 ...

  7. 【转】Spark源码分析之-scheduler模块

    原文地址:http://jerryshao.me/architecture/2013/04/21/Spark%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8B- ...

  8. LiteOS内核源码分析:位操作模块

    摘要:本文带领大家一起剖析了LiteOS位操作模块的源代码,代码非常简单,参考官方示例程序代码,实际编译运行一下,加深理解. 本文分享自华为云社区<LiteOS内核源码分析系列五 LiteOS内 ...

  9. Scrapy 源码分析之 RetryMiddleware 模块

    这是「进击的Coder」的第 689 篇技术分享 作者:TheWeiJun 来源:逆向与爬虫的故事 " 阅读本文大概需要 13 分钟. " 时隔一个多月,scrapy 章节又迎来了 ...

最新文章

  1. 使用mac pro电脑当tomcat端口被占用怎么解决?
  2. python信用卡违约_Python数据分析及可视化实例之银行信用卡违约预测(24)
  3. 给FreeBSD加上了防火墙
  4. mobx使用数组提示越界_向Mobx可观察数组添加操作
  5. CSDN产品公告:APP新增大厂在线刷题功能、博主排名规则更新、MD编辑器优化
  6. Tomcat(三):日志
  7. ResultSetMetaData和ResultSet
  8. 注册表修改大全(浏览文章时可以使用CTRL+F查找)
  9. Windows安装pytorch-gpu
  10. flash builder 4.6在debug调试时需要系统安装flashplayer debug版本
  11. jdk,jre,tommcat配置问题
  12. Java KeyTool 的使用
  13. 哲学家进餐问题 C++实现
  14. 物理化学第6版笔记和课后答案(天津大学)
  15. 交换机和路由器技术-07-静态路由配置
  16. 如何使投资收益最大化?
  17. Java方法创建及调用--------06
  18. 解决photoshop菜单卡顿,闪动,停顿问题
  19. 绘图工具-PlantUML
  20. 软件漏洞及缓冲区溢出

热门文章

  1. 拟牛顿法求解非线性方程组
  2. MICCAI 2020 | 基于3D监督预训练的全身病灶检测SOTA(预训练代码和模型已公开)...
  3. 电商新宠Tik Tok的接口详解
  4. 中国锌离子电池行业盈利动态与竞争前景预测报告(新版)2022-2027
  5. opengl各个坐标系理解与转换公式
  6. 电脑桌面日程管理工具
  7. 小游戏怎么提升app的用户留存
  8. Spring AOP统一功能处理(切面、切点、连接点、通知)
  9. php class 混合,extend/Extend/Library/ORG/Util/String.class.php at master · liu21st/extend · GitHub...
  10. USB接口类型与线序