在网络编程的入门阶段,我们通常会实现一个简单的 TCP 回显服务器。虽然基本的socket-bind-listen流程能够打通通信链路,但在实际应用中,单线程服务器往往会遇到“一夫当关,万夫莫开”的尴尬境地。
本文将结合实验代码,剖析单线程服务器的阻塞点,并探讨并发处理的必要性。
一、 回顾:TCP 服务器的基本流程
一个标准的 TCP 服务器逻辑遵循以下固定步骤:
- 创建套接字(
socket) - 绑定地址与端口(
bind) - 设置监听(
listen) - 等待接收连接(
accept) - 数据交互(
recv/send)
1. 基础代码实现(单线程版)
这段代码实现了最基本的通信逻辑,但它隐含了一个致命的问题:同一时间只能为一个客户端服务。
// server.c#include<stdio.h>#include<arpa/inet.h>#include<unistd.h>#include<string.h>intmain(){// 1. 创建监听套接字intlfd=socket(AF_INET,SOCK_STREAM,0);// 2. 绑定structsockaddr_inaddr;addr.sin_family