标签:
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() ,然后间隔一段时间以后,执行还是连接不上的话,还是再调用一次,这样的话,又能循环连接,又能不阻塞。
标签:
原文地址:http://www.cnblogs.com/cycxtz/p/4949512.html