这次我们主要来说说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 发布!

最新文章

  1. [LeetCode] Find the Celebrity 寻找名人
  2. 经典的找不到符号(symbol)错误 #iOS开发
  3. [Liferay6.2]AUI表单验证示例
  4. [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间
  5. visual studio运行时库MT、MTd、MD、MDd的研究(转载)
  6. Program B 暴力求解
  7. 关于doctype
  8. N元数组的子数组之和的最大值
  9. Java API —— HashMap类 & LinkedHashMap类
  10. Mybatis的学习总结(一)——使用配置文件实现增删改查
  11. TIOBE:全球编程语言最新排名(Kotlin排名进入前50名)
  12. Centos7 下安装Docke
  13. PAT1012:The Best Rank
  14. Linux中常用来查看进程的命令PS
  15. 关于Failed to check the status of the service com.taotao.service.ItemService. No provider available fo
  16. 第二篇——Struts2的Action搜索顺序
  17. 学习 rostopic
  18. Appium1.6,安装WebDriverAgent(WDA)
  19. cdh5.13.1 升/降级SPARK2 (parcel安装的同理)
  20. python之接口

热门文章

  1. Java中如何声明方法?JavaScript中如何声明函数?
  2. 什么是 Busy spin?我们为什么要使用它?
  3. 如何将Matlab中“模糊控制设计器”的隶属度函数导出图片(figure)
  4. 一个用于学习的react项目
  5. Web缓存总结
  6. 小程序完整对接 pingpp支付
  7. 微信小程序 使用filter过滤器几种方式
  8. 有关表单autocomplete = "off" 失效问题解决方案
  9. 如何实现多个接口Implementing Multiple Interface
  10. Android 预置APK