1. 说明
-
一个Connector类,使用了Channel,EventLoop,InetAddress类,功能是主动发起连接
-
noncoayable,enable_shared_from_this这个前面说过,就不赘述了
2. 变量
-
类型定义
- NewConnectionCallback.
-
EventLoop* loop_;
- 所属的EventLoop
-
InetAddress serverAddr_;
- 服务器端地址
-
bool connect_; // atomic
- 是否已经连接
-
States state_; // FIXME: use atomic variable
- 枚举类型的状态,一共有三种:连接中,未连接,已连接
-
std::unique_ptr channel_;
- Connector对应的通道,连接通道,连接成功后就没用了
-
NewConnectionCallback newConnectionCallback_;
- 连接成功回调函数
-
int retryDelayMs_;
- 重连延迟时间
-
static const int kMaxRetryDelayMs = 30*1000;
- 30秒,最大重连延迟时间
-
static const int kInitRetryDelayMs = 500
- 0.5s,初始状态,连接不上0.5秒后重连
-
枚举类型
- States,表示连接状态,有三种选择
3. 函数
1. 私有
-
void setState(States s)
- 如名,设置状态
-
void startInLoop();
- 如果connect_,调用下面的connect(),因为可能有另一个线程把connect_置为false
-
void stopInLoop();
- 如果连接中,就重置通道,此时connect_为false,所以不会尝试重连,关闭套接字后就直接就退出了.
-
void connect();
- 就是生成套接字,连接,如果连接失败就退出,超时就重连,连接成功就调用下面的connecting()
-
void connecting(int sockfd);
- 新建通道,设置写回调和错误回调,关注该通道读事件
-
void handleWrite();
- 将Channel从Poller关注中移除,并将Channel置为空,因为连接后这个Channel就没用了,不过socket可写不意味连接一定建立成功,还要通过getsockopt()确认一下,如果连接成功了,调用新连接回调函数
-
void handleError();
- 产生错误回调函数,重置通道,重连
-
void retry(int sockfd);
- 注册一个定时操作,在一段延迟后再次尝试连接
- 采用back-off策略重连,即连接时间逐渐延长,0.5s,1s,2s,直至30s
-
int removeAndResetChannel();
- 将Channel从Poller关注中移除,并将Channel置空
-
void resetChannel();
- 调用channel_.reset()
2. 公有
-
构造
- 初始化各变量,打印日志
-
析构
- 只打印日志
-
void setNewConnectionCallback(const NewConnectionCallback& cb)
- 如名
-
void start(); // can be called in any thread
- 可以跨线程调用,设置connect_为true,把startInLoop加入事件循环.
-
void restart(); // must be called in loop thread
- 重启
-
void stop(); // can be called in any thread
- 关闭连接,把stopInLoop()加入事件循环
-
const InetAddress& serverAddress() const
- 返回serverAddr_