http_conn 类
封装了 HTTP 连接的核心功能,主要包括以下方法:
void init():初始化连接。void close_conn():关闭连接。void process():主处理函数,由 epoll 触发后调用。bool read_once():一次性读取数据。bool write():发送响应数据。HTTP_CODE process_read():驱动状态机解析 HTTP 请求。bool process_write():生成 HTTP 响应。bool add_response():格式化字符串并追加到写缓冲区。bool add_content():添加内容到响应体。bool add_status_line():添加状态行。bool add_headers():添加通用响应头。bool add_content_length():单独添加 content_length 头。bool add_linger():添加Connection: keep-alive或close。bool add_blank_line():表示响应头结束。LINE_STATUS parse_line():从 m_read_buf 中查找完整一行。HTTP_CODE parse_request_line():解析请求行。HTTP_CODE parse_headers():解析单个请求头字段。HTTP_CODE parse_content():处理 POST 请求体。HTTP_CODE do_request():决定返回什么内容。void initmysql_result():一次性从数据库加载所有用户到全局。
事件驱动 (Event-Driven)
基于 Linux epoll I/O 多路复用模型的非阻塞 I/O 模型。程序不主动轮询或阻塞等待 I/O,而是注册对某些'事件'的兴趣,当事件发生时,由系统通知程序进行处理。
核心组件:
| 组件 | 作用 |
|---|---|
| epoll | Linux 高效 I/O 多路复用机制(替代 select/poll) |
| 非阻塞 socket | 避免 read/write 阻塞线程 |
| 事件循环(Event Loop) | 主线程不断调用 epoll_wait() 等待事件 |
| 回调/处理函数 | 事件触发时执行的逻辑(如 http_conn::process()) |
具体体现:
- 主线程使用
epoll_wait()监听多个 socket 事件。 - 当某个客户端 socket 可读或者可写,epoll 通知服务器。
- 非阻塞 socket + ET/LT 模式。
状态机 (State Machine)
HTTP 请求是分阶段、异步到达的(可能分多个 TCP 包),状态机能增量解析,避免等待完整数据,提升响应速度和内存效率。


