这篇文章用于分析muduo的TcpServer类和Acceptor类,原本打算将TcpConnection也放到这里一起聊的,但是那个太多啦,一篇文章太长会让人读的很不舒服把。
当然我用的代码是其他大神开发的flamingo的源码,这是一个基于muduo开发的即时聊天服务器
具体的地址https://blog.csdn.net/analogous_love/article/details/69481542
不废话了,进入正题吧
TcpServer 成员及构造
我有一个习惯,查看一个新class的时候,首先看private中有哪些成员,可能这样更好捋清class之间的关系把。
typedef std::map<string, TcpConnectionPtr> ConnectionMap;
private:
EventLoop* loop_; // the acceptor loop
const string hostport_;
const string name_;
std::shared_ptr<Acceptor> acceptor_; // avoid revealing Acceptor
std::shared_ptr<EventLoopThreadPool> eventLoopThreadPool_;
ConnectionCallback connectionCallback_;
MessageCallback messageCallback_;
WriteCompleteCallback writeCompleteCallback_;
ThreadInitCallback threadInitCallback_;
std::atomic<int> started_;
int nextConnId_; // always in loop thread
ConnectionMap connections_;//每个生成的链接的指针都会保存在这里
};
一个TcpServer有一个EventLoop,先简单的理解为用来接收新的连接。
(英文备注基本上是陈硕大佬自己写的备注)。
关于类之间的关系,可以看到持有一个Acceptor和一个EventLoopThreadPool的指针。
再看看TcpServer初始化的代码。
TcpServer::TcpServer(EventLoop* loop,
const InetAddress& listenAddr,
const std::string& nameArg,
Option option)
: loop_(loop),
hostport_(listenAddr.toIpPort()),
name_(nameArg),
acceptor_(new Acceptor(loop, listenAddr, option == kReusePort)),
//threadPool_(new EventLoopThreadPool(loop, name_)),
connectionCallback_(defaultConnectionCallback),
messageCallback_(defaultMessageCallback),
started_(0),
nextConnId_(1)
{
acceptor_->setNewConnectionCallback(std::bind(&TcpServer::newConnection, this, std::placeholders::_1, std::placeholders::_2));
}
TcpServer实例被创建的时候,会new一个Acceptor,并由自己对应得指针指向这个Acceptor,我们也可以从最后看出,Acceptor设置了回调函数,绑定为了TcpServer的newConnection函数,也就是说,当这一个Acceptor的newConnectionCallback_函数被调用的时候ÿ