C++ WebServer / 05
Connection 类:为什么需要用户态缓冲区
TCP 是字节流,没有消息边界。Connection 类把每个 fd 的读缓冲、写缓冲、HTTP 解析状态和写入进度保存下来。
这一阶段要解决什么问题
一次 read 可能读到半个 HTTP 请求,也可能读到多个请求的一部分。服务器不能假设一次 read 就对应一个完整请求。
原来的实现有什么缺陷
直接把 fd 和临时 buffer 传来传去时,连接状态很分散。非阻塞 I/O 下,请求和响应都可能跨多次事件完成,如果没有用户态缓冲区,状态会很难维护。
我是怎么改的
v3.2 抽出 Connection 类,保存 fd、read_buffer、write_buffer、解析游标、keep_alive、文件映射和写入进度。主线程和线程池都围绕 Connection 对象协作。
核心代码 / 关键逻辑
class Connection {
private:
int fd_;
std::string read_buffer_;
std::string write_buffer_;
CheckState check_state_;
bool keep_alive_;
size_t bytes_have_sent_;
};
踩坑记录
半包和粘包不是 TCP 的异常情况,而是字节流协议的正常表现。read_buffer 的意义就是把“暂时不完整”的数据保留下来,等下一次 EPOLLIN 后继续解析。