muduo 超时重连

TcpClient 在两种情况下会自动重连。

1. Connector::connect 返回的 error 中需要重连;

2. TcpClient::removeConnection 中判断需要重连;

最终都会调用 Connector::retry

void Connector::retry(int sockfd)
{
  sockets::close(sockfd); //关闭现有的fd
  setState(kDisconnected);//设置为未连接
  if (connect_)
  {
    LOG_INFO << "Connector::retry - Retry connecting to " << serverAddr_.toIpPort()
             << " in " << retryDelayMs_ << " milliseconds. ";
    loop_->runAfter(retryDelayMs_/1000.0,
                    boost::bind(&Connector::startInLoop, shared_from_this()));//设置定时器
    retryDelayMs_ = std::min(retryDelayMs_ * 2, kMaxRetryDelayMs);//重置重连时间
  }
  else
  {
    LOG_DEBUG << "do not connect";
  }
}

 

EventLoop::runAfter() 向 EventLoop 中有一个 timerQueue 添加一个 timer 对象,并更新 loop 中的 timefd 的事件注册,使用 timefd_settime() 当时间到了,就会触发 timefd 可读,然后在处理可读事件的函数里读取数据并重连 => 就执行多一次 Connector::startInLoop()  ,然后间隔一段时间以后,执行还是连接不上的话,还是再调用一次,这样的话,又能循环连接,又能不阻塞。

转载于:https://www.cnblogs.com/cycxtz/p/4949512.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值