这次我们开始muduo
源代码的实际编写,首先我们知道muduo
是LT
模式,Reactor
模式,下图为Reactor
模式的流程图[来源1]
然后我们来看下muduo
的整体架构[来源1]
首先muduo
有一个主反应堆mainReactor
以及几个子反应堆subReactor
,其中子反应堆的个数由用户使用setThreadNum
函数设置,mainReactor
中主要有一个Acceptor
,当用户建立新的连接的时候,Acceptor
会将connfd
和对应的事件打包为一个channel
然后采用轮询的算法,指定将该channel
给所选择的subReactor
,以后该subReactor
就负责该channel
的所有工作。
TcpServer类
我们按照从上到下的思路进行讲解,以下内容我们按照一个简单的EchoServer
的实现思路来讲解,我们知道当我们自己实现一个Server
的时候,会在构造函数中实例化一个TcpServer
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 不包括baseloop
server_.setThreadNum(3);
}