1. 项目概述
今天我想分享一个用C语言实现的简单服务器demo,采用"一请求一线程"的模型来处理客户端连接。这个项目虽然基础,但涵盖了Linux环境下网络编程的核心要素:socket创建、绑定、监听、多线程处理等。通过这个案例,我们可以深入理解服务器如何处理并发请求。
这个服务器的工作原理很简单:每当有新的客户端连接时,服务器会创建一个新线程专门处理该连接。客户端发送的任何数据都会被服务器原样返回(即实现了一个echo服务器)。我用Network Assistant工具测试了两个客户端同时连接的情况,验证了服务器的并发处理能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心设计思路
2.1 为什么选择"一请求一线程"模型
"一请求一线程"(Thread-per-request)是处理并发连接的经典模式之一,特别适合学习网络编程的初学者。它的主要优势在于:
- 逻辑简单直观:每个连接有独立的线程处理,代码结构清晰
- 调试方便:线程间相对独立,问题容易定位
- 适合教学:能很好地展示多线程与网络编程的结合
当然,这种模型在实际生产环境中也有明显缺点:
- 线程创建/销毁开销大
- 大量并发时线程数爆炸
- 线程间同步复杂
但对于我们这个demo和学习目的来说,它是最合适的选择。
2.2 整体架构设计
服务器的工作流程可以分为以下几个阶段:
-
初始化阶段:
- 创建监听socket
- 绑定IP和端口
- 开始监听
-
连接处理阶段:
- 接受新连接
- 为每个连接创建线程
- 线程处理客户端通信
-
通信阶段:
- 接收客户端数据
- 回传相同数据(echo)
- 记录通信日志
3. 关键代码解析
3.1 网络初始化部分
c复制// 创建监听socket
int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
if(listen_fd < 0){
perror("socket:");
exit(0);
}
// 配置服务器地址
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET
