Back to VNotes

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 后继续解析。