Back to VNotes

C++ WebServer / 02

v1.0:从阻塞式服务器开始

最初版本使用 socket、bind、listen、accept、read、write 完成一个单线程阻塞 echo server。它不复杂,但能把网络编程的基本链路跑通。

这一阶段要解决什么问题

先做一个最小可运行服务器:监听端口,接受客户端连接,读取数据,再写回响应。这个阶段的重点是理解 fd、监听 socket、客户端 socket 和基础系统调用。

原来的实现有什么缺陷

阻塞式服务器一次只能专注一个连接。accept 会阻塞,read 会阻塞,一个连接处理慢就会影响其他连接。它适合学习基本流程,但不适合多个客户端同时访问。

我是怎么改的

v1.0 先保留最直接的写法,不急着引入 epoll。这样后面每次重构都能清楚看到:到底是为了解决哪个阻塞点,或者为了让哪个状态从临时变量变成可管理对象。

核心代码 / 关键逻辑

while (true) {
    int conn_fd = accept(listen_fd, ...);
    read(conn_fd, buffer, sizeof(buffer));
    write(conn_fd, response, strlen(response));
    close(conn_fd);
}

踩坑记录

最开始容易误以为“能处理请求”就等于服务器完成了。但一旦开两个客户端,就会发现单连接阻塞会拖住整个流程。阻塞式版本的价值正是暴露这个瓶颈。