muduo源码分析之TcpServer

1.Class TcpServer:管理所有的Tcp客户连接,每个Tcp客户连接由一个类Tcpconnection管理(用来具体执行消息的收发),那么Tcpserver就是根据Accetor返回的新客户创建Tcpconnection-conn。

Tcpserver构造时接收一个由IP地址和port构成的InetAddress参数,并将此地址传给Acceptor用于接收该地址的Tcp连接。

TcpServer持有scoped_ptr<Acceptor>acceptor_用于接收Tcp请求链接,Acceport每次accept后将新连接的描述符connfd和地址peeraddr返回给使用者。 

muduo源码分析之TcpServer

2.Tcpserver::newConnection()主要功能就是为<connfd,peerAddr>创建一个TcpConnection管理该Tcp客户连接,加入map进行统一管理,并向TcpConnection中注册一下回调函数。如connectionCallback主要是在TcpServer中由用户指定一下连接处理函数,还有用户指定的消息处理回调(如message)等都是经过Tcpserver传给TcpConnection去执行,此外TcpServer::newConnection()还会执行TcpConnection::connectEstablished()该函数会使这个具体的TcpConnection连接对应的描述符connfd加入poll的事件表,也是通过一个Channel管理一个具体的Tcp客户连接。用户向TcpServer创建时会向Accepor注册回调;

Tcpserver::Tcpserver()->Acceptor::setNewConnetionCallback()后有新Tcp连接,接受连接,并执行回调给Tcpserver。

muduo源码分析之TcpServer

3.Tcpserver采用map<string,TcpConnectionPtr>管理所有的Tcp客户连接,其中string是由Tcpserver服务端地址加上一个Int构成表示TcpConnectionptr的名字。

Tcpserver中主要的回调:

(1)    ConnectionCallback:当Tcpconnection建立时调用由TcpConnection::connectEstablished()调用ConnectionCallback()用于执行用户指定的连接回调。

(2)    MessageCallback:当TcpConenction有网络消息时候执行,该函数调用过程Channel::handleEvent()->TcpConnection::handleRead()->messageCallback()。

(3)    WriteCallback由用户指定的当Tcp连接上的消息发送完毕时执行的回调。

这些函数都是用户在TcpServer创建后通过TcpServer::set*Callback系列函数注册的,当Acceptor接受一个新的客户端连接时:

Acceptor::handleRead()->TcpServer::newConnection()->TcpConnection::set*Callback()

这样完成用于指定函数的传递。在TcpConenction对应的socket事件就绪时可读/可写时由Channel::handEvent()执行这些用户指定的回调,即在TcpConnection中,通过bind()将函数传递给了TcpConnection,当Channel检测当有事件发生,会调用相应的回调函数。

TcpServer::RemoveConnection()主要功能从TcpServer中移除一个TcpConnection,但是不能直接移除,通过线程转移函数完成。(根据“oneloop per thread ”,所以每次操作涉及到Eventloop时,要判断这个Eventloop是否是本线程的,若是则同步执行函数,若不是则进行线程转移)

TcpServer::removeConenction()

EventLoop::runInLoop(bind(&TcpServer::removeConnectionInLoop)->EventLoop::runInLoop()->TcpServer::removeConnectionInLoop()

muduo源码分析之TcpServer

muduo源码分析之TcpServer

muduo源码分析之TcpServer