Muduo之Acceptor源码解析
前面我们大概介绍了Muduo网络库的整体架构以及Reactor模式的一般架构,从这里就开始分析Muduo网络库中用到的一些类。
本篇文章主要是介绍Acceptor
muduo网络库的example中作为server的类都是继承于class TcpServer
, 而TcpServer初始化的时候创建一个Acceptor对象、一个EventThreadPool对象以及一些Callback。因此从整体上来看Acceptor主要就是供TcpServer使用,生命期由后者控制,负责管理服务器监听的socket并将回调通知使用者,进行连接分发。下面我就专门分析下Acceptor的实现。
首先先看下类图:
首先从class Acceptor类的声明中可以看出该类包含主要包含如下几个数据成员:
class Acceptor : boost::noncopyable
{
public:
typedef boost::function<void (int sockfd,
const InetAddress&)> NewConnectionCallback;
Acceptor(EventLoop* loop, const InetAddress& listenAddr, bool reuseport);
~Acceptor();
void setNewConnectionCallback(const NewConnectionCallback& cb)
{ newConnectionCallback_ = cb; }
bool listenning() const { return listenning_; }
void listen();
private:
void handleRead();
EventLoop* loop_;
Socket acceptSocket_;
Channel acceptChannel_;
NewConnectionCallback newConnectionCallback_;
bool listenning_;
int idleFd_;
};
从上面可以看到主要包含一个EventLoop、Socket和一个Channel对象。
Acceptor主要负责服务器端的端口监听、事件连接以及事件分发。
acceptSocket_就是服务器监听端口的对象,class Socket
把传统意义上的socket进行封装,而class Channel
又是对socket的封装,他将socket以及对应的多个处理函数Callback封装在一起,那么当socket发生事件的时候,能够很快的找到相应的处理函数。
handleRead()是读事件处理