muduo的TCPserver端初始化步骤,以EchoServer

xiaoxiao2021-02-27  154

环境变量里加export MUDUO_LOG_TRACE=1使其打印出最多的日志

看这个库需要boost基础,这个专栏地址参考价值比较大

 EchoServer_unittest.cc代码如下

EventLoop loop;   InetAddress listenAddr(2000, false, ipv6);   EchoServer server(&loop, listenAddr);   server.start();   loop.loop();

1、EventLoop构造如下

EventLoop::EventLoop()   : looping_(false),     quit_(false),     eventHandling_(false),     callingPendingFunctors_(false),     iteration_(0),     threadId_(CurrentThread::tid()),     poller_(Poller::newDefaultPoller(this)),     timerQueue_(new TimerQueue(this)),     wakeupFd_(createEventfd()),     wakeupChannel_(new Channel(this, wakeupFd_)),     currentActiveChannel_(NULL) {   LOG_DEBUG << "EventLoop created " << this << " in thread " << threadId_;   LOG_TRACE << "wakeupFd_ = " << wakeupFd_ << " in thread " << threadId_;

以上这里poller_(Poller::newDefaultPoller(this)),new了个epoll对象代码如下

EPollPoller::EPollPoller(EventLoop* loop)   : Poller(loop),     epollfd_(::epoll_create1(EPOLL_CLOEXEC)),     events_(kInitEventListSize)

使用新API接口:epoll_create1创建了个epollfd_

接着在epollfd_下挂了关注三个fd

timerQueue_(new TimerQueue(this)),这里创建了个timerfd,并弄成了Channel

wakeupFd_(createEventfd()),     wakeupChannel_(new Channel(this, wakeupFd_)),

wakeupFd_  notify里用的 唤醒 EventLoop 的 是baseloop?待后面研究

EchoServer server(&loop, listenAddr);这句构造函数如下

TcpServer::TcpServer(EventLoop* loop,                      const InetAddress& listenAddr,                      const string& nameArg,                      Option option)   : loop_(CHECK_NOTNULL(loop)),     ipPort_(listenAddr.toIpPort()),     name_(nameArg),     acceptor_(new Acceptor(loop, listenAddr, option == kReusePort)),     threadPool_(new EventLoopThreadPool(loop, name_)),     connectionCallback_(defaultConnectionCallback),     messageCallback_(defaultMessageCallback),     nextConnId_(1)

创建了Acceptor 和 EventLoopThreadPool

Acceptor::Acceptor(EventLoop* loop, const InetAddress& listenAddr, bool reuseport)   : loop_(loop),     acceptSocket_(sockets::createNonblockingOrDie(listenAddr.family())),     acceptChannel_(loop, acceptSocket_.fd()),     listenning_(false),     idleFd_(::open("/dev/null", O_RDONLY | O_CLOEXEC)) {   assert(idleFd_ >= 0);   LOG_TRACE << "acceptSocket_.fd = " << acceptSocket_.fd();

Acceptor这里就创建了acceptSocket_.fd

loop_是base pool  threadPool_是根据setThreadNum设置才有的

接着 server.start();代码如下启动监听

void TcpServer::start() {   if (started_.getAndSet(1) == 0)   {     threadPool_->start(threadInitCallback_);     assert(!acceptor_->listenning());     loop_->runInLoop(         boost::bind(&Acceptor::listen, get_pointer(acceptor_)));   } }

Acceptor::listen里有acceptChannel_.enableReading();这句 ,类似Channel的enable系列里面都有 update 就最终在EPollPoller.cc文件里

TRACE updateChannel fd = 6 events = 3 index = -1 - EPollPoller.cc:113 20170830 12:39:39.678981Z  5875 TRACE update epoll_ctl op = ADD fd = 6 event = { 6: IN PRI  } - EPollPoller.cc:181 实现效果了

接着 void EventLoop::loop()就 pollReturnTime_ = poller_->poll(kPollTimeMs, &activeChannels_); poll在这个地方了

日志如下

[root@localhost bin]# ./echoserver_unittest 20170830 12:39:39.675537Z  5875 INFO  pid = 5875, tid = 5875 - EchoServer_unittest.cc:73 20170830 12:39:39.675809Z  5875 INFO  sizeof TcpConnection = 236 - EchoServer_unittest.cc:74 20170830 12:39:39.675863Z  5875 TRACE EPollPoller epollfd_ = 3 - EPollPoller.cc:45 20170830 12:39:39.675891Z  5875 TRACE Channel fd_ = 4 - Channel.cc:35 20170830 12:39:39.675904Z  5875 TRACE Channel loop_ = 0xBFD1F1E0 - Channel.cc:36 20170830 12:39:39.675910Z  5875 TRACE TimerQueue timerfd_ = 4 - TimerQueue.cc:102 20170830 12:39:39.675918Z  5875 TRACE updateChannel fd = 4 events = 3 index = -1 - EPollPoller.cc:113 20170830 12:39:39.676131Z  5875 TRACE update epoll_ctl op = ADD fd = 4 event = { 4: IN PRI  } - EPollPoller.cc:181 20170830 12:39:39.676167Z  5875 TRACE Channel fd_ = 5 - Channel.cc:35 20170830 12:39:39.676174Z  5875 TRACE Channel loop_ = 0xBFD1F1E0 - Channel.cc:36 20170830 12:39:39.676181Z  5875 DEBUG EventLoop EventLoop created 0xBFD1F1E0 in thread 5875 - EventLoop.cc:76 20170830 12:39:39.676192Z  5875 TRACE EventLoop wakeupFd_ = 5 in thread 5875 - EventLoop.cc:77 20170830 12:39:39.676205Z  5875 TRACE updateChannel fd = 5 events = 3 index = -1 - EPollPoller.cc:113 20170830 12:39:39.676219Z  5875 TRACE update epoll_ctl op = ADD fd = 5 event = { 5: IN PRI  } - EPollPoller.cc:181 20170830 12:39:39.676279Z  5875 TRACE Channel fd_ = 6 - Channel.cc:35 20170830 12:39:39.676287Z  5875 TRACE Channel loop_ = 0xBFD1F1E0 - Channel.cc:36 20170830 12:39:39.678890Z  5875 TRACE Acceptor acceptSocket_.fd = 6 - Acceptor.cc:34 20170830 12:39:39.678955Z  5875 TRACE updateChannel fd = 6 events = 3 index = -1 - EPollPoller.cc:113 20170830 12:39:39.678981Z  5875 TRACE update epoll_ctl op = ADD fd = 6 event = { 6: IN PRI  } - EPollPoller.cc:181 20170830 12:39:39.678993Z  5875 TRACE loop EventLoop 0xBFD1F1E0 start looping - EventLoop.cc:109 20170830 12:39:39.678999Z  5875 TRACE poll fd total count 3 - EPollPoller.cc:59 20170830 12:39:49.679514Z  5875 TRACE poll nothing happended - EPollPoller.cc:77 20170830 12:39:49.679567Z  5875 TRACE poll fd total count 3 - EPollPoller.cc:59 20170830 12:39:59.694012Z  5875 TRACE poll nothing happended - EPollPoller.cc:77 20170830 12:39:59.694126Z  5875 TRACE poll fd total count 3 - EPollPoller.cc:59 20170830 12:40:09.709135Z  5875 TRACE poll nothing happended - EPollPoller.cc:77 20170830 12:40:09.709186Z  5875 TRACE poll fd total count 3 - EPollPoller.cc:59 20170830 12:40:19.713299Z  5875 TRACE poll nothing happended - EPollPoller.cc:77 20170830 12:40:19.713349Z  5875 TRACE poll fd total count 3 - EPollPoller.cc:59

转载请注明原文地址: https://www.6miu.com/read-14196.html

最新回复(0)