Linux/C++ 网络篇(一)
网络编程入门:一文搞懂 TCP/UDP 编程模型与 Socket 核心流程
一、Socket 是什么
Socket 本质是内核提供的一套网络接口,把网络连接抽象成“文件”,让程序通过读写文件的方式收发数据。 它是TCP/UDP 编程的统一入口,也是 C++ 网络服务的基础。
二、TCP 编程模型(面向连接、可靠、流式)
核心特点
- 面向连接,三次握手、四次挥手
- 可靠传输、无丢失、无乱序、无重复
- 字节流,无边界,需自己处理粘包
- 适合:文件传输、HTTP、数据库、长连接服务
服务端流程(标准5步)
- socket() :创建套接字(AF_INET, SOCK_STREAM, 0)
- bind() :绑定 IP + 端口
- listen() :开启监听,设定等待队列
- accept() :阻塞等待客户端连接,返回新 fd
- read()/write() 或 recv()/send() :收发数据
- close():关闭连接
客户端流程(标准3步)
- socket() :创建套接字
- connect() :主动连接服务器
- read()/write() :收发数据
- close()
三、UDP 编程模型(无连接、不可靠、数据报)
核心特点
- 无连接,不握手、不断开
- 不可靠,可能丢包、乱序
- 数据报模式,有边界,不粘包
- 速度快、开销小
- 适合:音视频、直播、DNS、心跳、游戏
服务端 & 客户端流程(几乎一样)
- socket() :创建套接字(SOCK_DGRAM)
- bind() :服务端必须绑定,客户端可选
- recvfrom() :接收数据(获取对方地址)
- sendto() :发送数据(指定目标地址) 无 connect、listen、accept。
四、TCP / UDP 核心区别(面试必背)
- TCP:面向连接、可靠、流式、慢、适合精确传输
- UDP:无连接、不可靠、数据报、快、适合实时传输
五、最简单 C++ Socket 模板(可直接跑)
TCP 服务端极简代码
// 创建socket -> bind -> listen -> accept -> recv/send
int lfd = socket(AF_INET, SOCK_STREAM, 0);
bind(lfd, ...);
listen(lfd, 128);
int cfd = accept(lfd, ...);
char buf[1024];
int n = recv(cfd, buf, 1024, 0);
send(cfd, "ok", 2, 0);
UDP 极简代码
// 创建socket -> bind -> recvfrom/sendto
int fd = socket(AF_INET, SOCK_DGRAM, 0);
bind(fd, ...);
char buf[1024];
struct sockaddr_in cliaddr;
recvfrom(fd, buf, 1024, 0, (sockaddr*)&cliaddr, ...);
sendto(fd, "ok", 2, 0, (sockaddr*)&cliaddr, ...);
六、本文总结
- Socket = 网络编程入口
- TCP = 可靠连接,标准 C/S 模型
- UDP = 无连接数据报,轻量高效
- 掌握这套模型,就能写 echo 服务器、HTTP 服务器、内网穿透、游戏网关等各类网络程序。
如果你需要,我可以在下一篇直接给你: 可编译运行的完整 TCP 服务端+客户端 C++ 代码(带错误处理)+ UDP 示例 + 粘包讲解。