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