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