美文网首页浅析muduo网络库程序员
浅析muduo网络库之Connector

浅析muduo网络库之Connector

作者: 谢昆明 | 来源:发表于2018-01-10 11:33 被阅读72次

    在TCPClient里面用到了Connector,这个是干嘛的

    1 想也没用,找找代码

    Connector::Connector(EventLoop* loop, const InetAddress& serverAddr)
      : loop_(loop),
        serverAddr_(serverAddr),
        connect_(false),
        state_(kDisconnected),
        retryDelayMs_(kInitRetryDelayMs)
    {
      LOG_DEBUG << "ctor[" << this << "]";
    }
    

    关键参数是哪个?
    还用想,EventLoop。
    估计所有的操作都会放到loop里面

    2 看看头文件吧

      void start();  // can be called in any thread
      void restart();  // must be called in loop thread
      void stop();  // can be called in any thread
    

    感兴趣的方法有三个,分别如上。
    下面分析分析

    2.1 start

    void Connector::start()
    {
      connect_ = true;
      loop_->runInLoop(boost::bind(&Connector::startInLoop, this)); // FIXME: unsafe
    }
    

    看看,确实是在loop里面执行的。
    代码不全,再贴一点

    
    void Connector::startInLoop()
    {
      loop_->assertInLoopThread();
      assert(state_ == kDisconnected);
      if (connect_)
      {
        connect();
      }
      else
      {
        LOG_DEBUG << "do not connect";
      }
    }
    
    void Connector::connect()
    {
      int sockfd = sockets::createNonblockingOrDie(serverAddr_.family());
      int ret = sockets::connect(sockfd, serverAddr_.getSockAddr());
      int savedErrno = (ret == 0) ? 0 : errno;
      switch (savedErrno)
      {
        case 0:
        case EINPROGRESS:
        case EINTR:
        case EISCONN:
          connecting(sockfd);
          break;
    
        case EAGAIN:
        case EADDRINUSE:
        case EADDRNOTAVAIL:
        case ECONNREFUSED:
        case ENETUNREACH:
          retry(sockfd);
          break;
    
        case EACCES:
        case EPERM:
        case EAFNOSUPPORT:
        case EALREADY:
        case EBADF:
        case EFAULT:
        case ENOTSOCK:
          LOG_SYSERR << "connect error in Connector::startInLoop " << savedErrno;
          sockets::close(sockfd);
          break;
    
        default:
          LOG_SYSERR << "Unexpected error in Connector::startInLoop " << savedErrno;
          sockets::close(sockfd);
          // connectErrorCallback_();
          break;
      }
    }
    

    这么多行,我就不看了。
    意思就是执行下connect()

    2.2 restart

    void Connector::restart()
    {
      loop_->assertInLoopThread();
      setState(kDisconnected);
      retryDelayMs_ = kInitRetryDelayMs;
      connect_ = true;
      startInLoop();
    }
    

    关键代码有两行,
    设置断开的状态setState(kDisconnected);
    连接startInLoop();
    跟start()差不多

    2.3 stop

    
    void Connector::stop()
    {
      connect_ = false;
      loop_->queueInLoop(boost::bind(&Connector::stopInLoop, this)); // FIXME: unsafe
      // FIXME: cancel timer
    }
    
    void Connector::stopInLoop()
    {
      loop_->assertInLoopThread();
      if (state_ == kConnecting)
      {
        setState(kDisconnected);
        int sockfd = removeAndResetChannel();
        retry(sockfd);
      }
    }
    
    

    代码少,直接上。

    打赏

    如果这篇文章解决了您的问题,让我买根烟抽抽。

    支付宝.jpg 微信.jpg

    相关文章

      网友评论

        本文标题:浅析muduo网络库之Connector

        本文链接:https://www.haomeiwen.com/subject/whqnnxtx.html