计算机网络八股
344 2023-04-03 05:01:31
这次我们主要来说说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 发布!