Acceptor类
Acceptor类主要成员数据:
EventLoop* loop_;
Socket acceptSocket_;
Channel acceptChannel_;
NewConnectionCallback newConnectionCallback_;
传统服务端socket模型为:
创建服务端socket,bind地址,监听listen,accept接受客户端请求。
这些操作都由Acceptor类完成,其中创建socket并绑定地址由构造函数完成,Acceptor::listen()完成socket监听——acceptChannel_设置监听读事件,当客户端连接时自动触发handleRead()接受客户端请求并交由newConnectionCallback_(connfd, peerAddr)处理。
newConnectionCallback_在TcpServer构造函数中设置为TcpServer::newConnection。
TcpServer类
TcpServer类主要成员数据:
typedef std::map<string, TcpConnectionPtr> ConnectionMap;
EventLoop* loop_; // the acceptor loop
const string ipPort_;
boost::scoped_ptr<Acceptor> acceptor_;
boost::shared_ptr<EventLoopThreadPool> threadPool_;
AtomicInt32 started_;
int nextConnId_;
ConnectionMap connections_;
当创建TcpServer对象,并调用start()后,便交由acceptor_完成了Acceptor类中介绍的功能。
TcpServer::newConnection功能与TcpClient::newConnection类似,只不过TcpConnection::connectEstablished交由I/O线程池处理。
connections_记录connName与conn(TcpConnection对象)对应关系。
析构时依次销毁connections_中的TcpConnection对象——不再监听各socket。
总结
相对TcpClient,TcpServer就简单的多,main reactor 负责监听,sub reactor负责处理。
到此,muduo网络库的代码部分算是看完了,至于例子,以后再看,看了可能也不会写了。