📌 核心结论(TL;DR):
为什么需要重连:网络波动或服务器重启会导致 TCP 断开,客户端需具备自愈能力。
核心思路:用状态机(State Machine)管理连接。
状态定义:
NEW、CONNECTED、DISCONNECTED(掉线)、CLOSED(彻底放弃)。重连机制:设置最大重试次数(如5次)和间隔(如1秒),超限则退出。
一、 状态机设计
客户端核心就是一个大while循环,每次根据当前Status决定下一步行为:
NEW-> 发起connect。CONNECTED-> 执行read/write。DISCONNECTED-> 执行Reconnect(先重试 5 次)。
二、 如何检测掉线?
在read()时,如果返回值为0,说明收到了服务端的 FIN 包。此时将状态设置为DISCONNECTED,交给主循环去处理重连。
三、 代码实现
enum class Status { NEW, CONNECTING, CONNECTED, DISCONNECTED, CLOSED }; // 重连逻辑 void Reconnect() { _status = Status::CONNECTING; int count = 0; while (count < _max_retries) { Connect(); if (_status == Status::CONNECTED) return; sleep(_retry_interval); count++; } _status = Status::CLOSED; // 彻底失败 }