1.TcpServer/TcpConnection
-
Acceptor类的主要功能是socket、bind、listen
-
一般来说,在上层应用程序中,我们不直接使用Acceptor,而是把它作为TcpServer的成员,TcpServer就具有了Acceptor功能
-
TcpServer还包含了一个TcpConnection列表
因为TcpServer能够处理多个连接 -
TcpConnection与Acceptor类似,有两个重要的数据成员,Socket与Channel,Channel关注Socket可读可写的事件
-
时序图
(1)当一个连接到来,EventLoop的事件循环loop()返回了一个活跃的通道Channel,该Channel实际上是Acceptor中的一个通道,当该通道返回,会调用Channel中的handleEvent()来处理这个事件,连接到来属于可读事件,又回调了Acceptor中的handleRead()成员函数来处理这个可读事件,在handleRead()中又调用了accept()来处理新的连接,接着又回调了TcpServer的newConnecton(),在该函数中先是创建一个TcpConnection对象,然后通过TcpConnection对象调用connectEstablished()成员函数,在该成员函数中回调用户注册的connCb();
(2)connCb()是在TcpServer中void setConnectionCallback(const ConnectionCallback& cb)注册的;
连接消息的到来的回调函数也是在TcpServer中void setMessageCallback(const MessageCallback& cb)注册的;
-
eg:33\jmuduo\muduo\net\TcpServer.h
33\jmuduo\muduo\net\TcpServer.cc
33\jmuduo\muduo\net\TcpConnection.h
33\jmuduo\muduo\net\TcpConnection.cc
33\jmuduo\muduo\net\Callbacks.h
33\jmuduo\muduo\net\CMakeLists.txt -
eg测试:33\jmuduo\tests\Reactor_test08.cc
33\jmuduo\tests\Reactor_test09.cc
33\jmuduo\tests\CMakeLists.txt -
测试:
客户端使用telnet测试
客户端断开会出现busy-loop状态,即Poller认为是处于高电平的状态。