前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >muduo 超时重连

muduo 超时重连

作者头像
forxtz
发布2020-10-10 16:43:17
9240
发布2020-10-10 16:43:17
举报
文章被收录于专栏:源懒由码

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

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

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

最终都会调用 Connector::retry

代码语言:javascript
复制
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() ,然后间隔一段时间以后,执行还是连接不上的话,还是再调用一次,这样的话,又能循环连接,又能不阻塞。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-11-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档