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