C++ 高性能网络服务骨架(一)—— 从 0 搭一个最小 TCP 服务端(阻塞版)

张开发
2026/4/19 7:39:54 15 分钟阅读

分享文章

C++ 高性能网络服务骨架(一)—— 从 0 搭一个最小 TCP 服务端(阻塞版)
为什么要从“最简单”的 TCP 服务端开始很多人一学网络编程就想直接上epollReactor高并发模型但如果你没搞清楚这些最基础的问题socket 怎么创建accept 到底返回什么read / write 怎么完成一次请求响应一个连接什么时候结束那你后面学到的东西大概率是❌ API 会用❌ 模型会背❌ 但自己写不出来所以这一篇的目标非常明确✅ 搭一个“能跑通”的最小 TCP 服务端✅ 搞清楚一次请求的完整链路一、网络服务端到底在干什么先给你一个最核心的流程图客户端浏览器 / curl │ ▼ 服务器监听端口 │ accept() │ 建立连接 │ read() │ 处理请求 │ write() │ 关闭连接 这就是所有服务端的最小本质。二、核心 API 一次讲清1️⃣ socket —— 创建“通信端点”int server_fd socket(AF_INET, SOCK_STREAM, 0);含义AF_INET→ IPv4SOCK_STREAM→ TCP 类比 Javanew ServerSocket(...)2️⃣ bind —— 绑定端口bind(server_fd, (sockaddr*)addr, sizeof(addr)); 作用把 socket 绑定到某个 IP 端口3️⃣ listen —— 开始监听listen(server_fd, 10); 含义允许客户端连接10 等待队列大小4️⃣ accept —— 接收连接最重要int client_fd accept(server_fd, ...); 返回一个新的 socketclient_fd⚠️ 非常关键server_fd只负责监听client_fd用于通信5️⃣ read / write —— 数据收发read(client_fd, buffer, size); write(client_fd, response, len); 一次请求 一次读写过程 三、完整最小 TCP 服务端可运行可以直接复制运行Linux / macOS#include iostream #include cstring #include unistd.h #include arpa/inet.h int main() { // 1. 创建 socket int server_fd socket(AF_INET, SOCK_STREAM, 0); // 2. 配置地址 sockaddr_in addr{}; addr.sin_family AF_INET; addr.sin_port htons(8080); addr.sin_addr.s_addr INADDR_ANY; // 3. 绑定 bind(server_fd, (sockaddr*)addr, sizeof(addr)); // 4. 监听 listen(server_fd, 10); std::cout Server listening on port 8080... std::endl; while (true) { // 5. 接收连接 sockaddr_in client_addr{}; socklen_t len sizeof(client_addr); int client_fd accept(server_fd, (sockaddr*)client_addr, len); std::cout Client connected std::endl; // 6. 读取请求 char buffer[1024] {0}; read(client_fd, buffer, sizeof(buffer)); std::cout Received:\n buffer std::endl; // 7. 返回响应 const char* response HTTP/1.1 200 OK\r\n Content-Length: 13\r\n \r\n Hello, World!; write(client_fd, response, strlen(response)); // 8. 关闭连接 close(client_fd); } return 0; }四、怎么测试运行程序g server.cpp -o server ./server然后浏览器访问http://localhost:8080或者curl localhost:8080 输出Hello, World!五、这段代码到底做了什么一次完整请求流程客户端发起请求 ↓ accept 返回 client_fd ↓ read 读取请求数据 ↓ write 返回响应 ↓ close 关闭连接核心理解 服务端的本质就是一个无限循环 接收连接 处理连接六、Java 对比Java 写法ServerSocket server new ServerSocket(8080); while (true) { Socket client server.accept(); InputStream in client.getInputStream(); OutputStream out client.getOutputStream(); // read / write }对应关系JavaCServerSocketsocket bind listenaccept()accept()InputStreamread()OutputStreamwrite() 本质完全一样。七、这个版本的问题非常关键这个服务端❌ 只能同时处理一个连接原因accept → read → write → close是串行执行问题表现如果一个请求很慢 后面的连接全部阻塞八、这就是下一步要解决的问题 如何让accept 继续接收连接同时多个请求能并发处理下一篇预告《C 高性能网络服务骨架二》—— 线程池接入accept 与 worker 分离下一步模型主线程 accept 新连接 ↓ 把连接丢给线程池 ↓ worker 线程处理请求你会真正理解线程池在服务端的作用accept 和处理逻辑为什么要分离并发模型是怎么搭起来的总结建议记住一个服务端本质就是循环 accept 处理连接你现在已经完成了✔ 第一步搞清楚“连接是怎么来的”接下来要做的是让多个连接同时被处理并发化

更多文章