這次我們主要來說說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 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/464972.html
標籤:Go
上一篇:C++基礎-類與物件(3)
