1. Linux下TCP通信基础与项目概述
在Linux网络编程中,TCP协议因其可靠性成为最常用的传输层协议。这个项目实现了一个基础版的TCP服务端-客户端通信模型,采用单进程/单线程架构,非常适合初学者理解网络通信的核心机制。
我十年前第一次接触Linux网络编程时,就是从这样的基础模型入手的。虽然现在高并发场景多用多线程/多进程方案,但掌握这个基础版本能让你真正理解TCP通信的本质。就像学开车要先熟悉手动挡一样,这个项目就是网络编程的"手动挡"基础版。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. TCP通信核心原理拆解
2.1 TCP三次握手与通信流程
TCP建立连接需要三次握手:
- 客户端发送SYN=1, seq=x
- 服务端回复SYN=1, ACK=1, seq=y, ack=x+1
- 客户端发送ACK=1, seq=x+1, ack=y+1
在代码中,这个过程被封装在connect()和accept()函数里。我常跟新手说:"不要被三次握手吓到,内核已经帮你处理了99%的工作"。
2.2 单进程/单线程模型特点
这种模型的特点是:
- 服务端同一时间只能处理一个客户端连接
- 处理完当前请求后才能接受新连接
- 实现简单,适合低并发场景
注意:实际生产环境很少用这种模型,但作为学习原型非常合适
3. 服务端实现详解
3.1 服务端核心代码结构
c复制int main() {
// 1. 创建socket
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
// 2. 绑定地址
struct sockaddr_in addr;
bind(server_fd, (struct sockaddr*)&addr, sizeof(addr));
// 3. 监听
listen(server_fd, 5);
// 4. 接受连接
int client_fd = accept(server_fd, NULL, NULL);
// 5. 通信处理
char buffer[1024];
read(client_fd, buffer, sizeof(buffer));
// 业务处理...
write(client_fd, response, strlen(response));
// 6. 关闭连接
close(client_fd);
close(server_fd);
}
3.2 关键参数解析
SOCK_STREAM:指定TCP协议listen()的backlog参数:建议设为5-10,表示等待队列长度read()/write():注意处理部分读写的情况
4. 客户端实现详解
4.1 客户端核心代码
c复制int main() {
// 1. 创建socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
// 2. 连接服务器
struct sockaddr_in serv_addr;
connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
// 3. 发送数据
write(sockfd, message, strlen(message));
// 4. 接收响应
char buffer[1024];
read(sockfd, buffer, sizeof(buffer));
// 5. 关闭连接
close(sockfd);
}
4.2 连接超时处理
实际项目中必须添加超时控制:
c复制struct timeval timeout = {3, 0}; // 3秒
setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
5. 常见问题与调试技巧
5.1 典型问题排查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| Connection refused | 服务端未启动/端口错误 | 检查服务端进程和端口 |
| 数据发送不完整 | 未处理部分写情况 | 循环调用write直到全部发送 |
| 地址已在使用 | 端口未完全释放 | 设置SO_REUSEADDR选项 |
5.2 网络调试利器
netstat -antp:查看TCP连接状态tcpdump -i any port 你的端口号:抓包分析telnet 127.0.0.1 端口号:快速测试端口连通性
6. 项目扩展方向
虽然这个基础版很简单,但可以通过以下方式扩展:
- 添加多客户端支持(fork或select)
- 实现简单协议(如自定义包头)
- 加入心跳机制检测连接存活
我在实际项目中发现,很多复杂的网络问题都可以回归到这个基础模型来分析。建议新手先把这个版本吃透,再学习更高级的模型。
