muduo库源码分解(二) 处事端
当前位置:以往代写 > C/C++ 教程 >muduo库源码分解(二) 处事端
2019-06-13

muduo库源码分解(二) 处事端

muduo库源码分解(二) 处事端

一. TcpServer类:

打点所有的TCP客户毗连,TcpServer供用户直接利用,生命期由用户直接节制。用户只需配置好相应的回调函数(如动静处理惩罚messageCallback)然后TcpServer::start()即可。

主要数据成员:

boost::scoped_ptr<Accepter> acceptor_; 用来接管毗连

std::map<string,TcpConnectionPtr> connections_; 用来存储所有毗连

connectonCallback_,messageCallback_,writeCompleteCallback_,用来接管用户注册的回调函数

EventLoop* loop; 接管毗连的事件轮回

主要成果函数:

set*Callbak() 注册用户回调函数

newconnection() 需要在结构函数内将其注册给Acceptor,当Acceptor接管一个毗连之后回调该函数。在本函数内部新建一个connection工具,并将 *Callback_注册给新建的 Connection 工具。最后,从线程池取出一个线程做I/O线程,在该I/O线程的 EventLoop 的 runInLoop() 中传入 TcpConnection::connectEstablished(). 因为一定不在一个线程中,在runInLoop()中挪用EventLoop::quueInLoop(),将TcpConnection::connectEstablished()插手pendingFunctors.

二. Acceptor类:

认真监听毗连请求,吸收毗连并将新的毗连返回给TcpServer。

Acceptor主要是供TcpServer利用的,其生命期由后者节制。一个Acceptor相当于持有处事端的一个listenning socket描写符,该socket可以accept多个TCP客户毗连,。

主要数据成员:

EventLoop* loop_;

Socket acceptSocket_;封装了socket等,用来监听

Channel acceptChannel_;Acceptor通过Channel向Poller注册事件,EventLoop通过Channel分发回调Acceptor相应的事件处理惩罚函数。

boost::function<void(sockfd,InetAddress&)>NewConnectionCallback_ , 毗连请求吸收之后,通过其回调TcpServer::newconnection().

主要成果函数:

listen(),挪用Socket::listen()开始监听,同时,挪用Channel::enableReading()向Poller注册可读事件,有数据可读代表新来了毗连请求。

handleRead(),在结构函数中将其注册给Channel::readCallback_。当Poller发明属于Acceptor的Channel的可读事件时,在EventLoop中会驱动Channel::handleEvent()–>Channel::handleEventWithGuard()举办事件分发,挪用readCallback回调 Acceptor::handlRead(),在其内挪用Socekt::accept(),再回调TcpServer::newconnection(),将新毗连的sockfd传回给TcpServer。

处事端监听及接管毗连的流程:

向Poller注册监听事件的主线挪用流程,TcpServer::start()–>EventLoop::runInLoop(Acceptor::listen())–>Channel::enableReading()–>Channel::update(this)–>EventLoop::updateChannel(Channel*)–>Poller::updateChannel(Channel*)

接管毗连,当Poller::poll()发明有事件停当,通过 Poller::fillActiveChannel() 迁停当事件对应的 Channel 插手 ActiveChannelList,

EventLoop::loop()–>Poller::poll()–>Poller::fillActiveChannel(),loop()–>Channel::handleEvent()->Acceptor::handleRead()->TcpServer::newConnection()->EventLoop::runInLoop(bind(&TcpConnection::connectEstablished))->EventLoop::queueInLoop()->EventLoop::loop()->EventLoop::doPendingFunctors()->TcpConnection::connectEstablished()。

三. Connection类:

用于打点一个详细的TCP客户毗连,完成用户指定的毗连回调connectionCallback。
TcpConnection结构时吸收参数有TCP毗连的描写符sockfd,处事端地点localAddr,客户端地点peerAddr,并通过Socket封装sockfd。且回收Channel打点该sockfd,

主要数据成员:

enum StateE { kDisconnected, kConnecting, kConnected, kDisconnecting };别离暗示已断开,正在毗连,已毗连,正在断开。

scoped_ptr<Socket> socket_;封装该毗连的socket

scoped_ptr<Channel> channel_;毗连可以通过该channel向Poller注册该毗连的读写等事件。毗连还要向Channel注册TcpConection的可读/可写/封锁/堕落系列回调函数,用于Poller返回停当事件后Channel::handleEvent()执行相应事件的回调。

boost::function<void()> **Callback_,在TcpServer::newconnection()中建设TcpConnection时,就会将TcpServer中的各类处理惩罚函数注册给相应的 TcpConnection::*Callback_ 。

Buffer inputBuffer_,outputBuffer_。输入输出的缓冲。

主要成果函数:

handle{Read(),Write(),Close(),Error()},处理惩罚毗连的各类事件,会由Channel::handleEvent()按照Poller返回的详细停当事件分发挪用相应的TcpConnection::handle**().

connectEstablished(),配置毗连的状态为kConnected,将channel_举办绑定,挪用channel::enableReading()向Poller注册读事件,最后回调connectionCallback_会回调TcpServer中相应的回调函数,一般会在TcpServer中继承回挪用户传进来的回调函数。

send(),sendInLoop(),send()有几个重载都是举办产生数据,send()–>sendInLoop(),后者中检测输出buffer中没有数据列队就直接写,假如没有写完,可能outbuffer中有数据列队则将数据追加到outbuffer中,然后挪用channel::enableWriting()向Poller注册写事件。

TcpConnection::setTcpNoDelay()->socketopt(..,TCP_NODELAY..)来封锁Nagle算法。

发送数据流程:

#p#分页标题#e#

TcpConnection::send(string& message)->EventLoop::runInLoop(bind(&TcpConnection::sendInLoop(string& message))->EventLoop::doPendingFunctors()->TcpConnection::sendInLoop(string& message)担保动静发送的线程安详,后者通过write系统挪用发送动静。

当Poller返回一个毗连的可写可能可读停当事件时,回调进程雷同Acceptor的毗毗邻管进程。

    关键字:

在线提交作业