一、 数据的“中转站”:内核缓冲区
在 Socket 编程中,你以为你是在跟网络对话,其实你只是在跟操作系统的内存对话。
1. 双缓冲机制
每个建立连接的 Socket(即通信文件描述符cfd),在内核中都有两块专属内存:
- 读缓冲区 (Read Buffer):网卡收到的数据,操作系统会先搬到这里,等着你去
read。 - 写缓冲区 (Write Buffer):你调用
write发送的数据,其实是先抄到这里,然后操作系统会在合适的时候帮你发出去。
2. 读写函数的本质
write(cfd, "hello", 5):- 动作:把应用层的 “hello”拷贝到内核的写缓冲区。
- 耗时:极快(纯内存操作)。
- 注意:函数返回成功,只代表数据进了缓冲区,不代表对方收到了。
read(cfd, buf, 1024):- 动作:去内核的读缓冲区看看有没有数据。
- 阻塞:如果缓冲区是空的,
read就会让程序暂停(阻塞),直到有数据送达。 - 非对等性:对方一次发了 4KB,你可以分 40 次,每次读 100 字节。这就是TCP 面向流 (Stream)的特性。
二、 函数对比:Read/Write vs Recv/Send
在 Linux 网络编程中,有两套常用的读写函数。
1. 标准文件 IO (read/write)
ssize_tread(intfd,void*buf,size_tcount);ssize_twrite(intfd,constvoid*buf,size_tcount);- 特点:通用性强,不仅用于 Socket,也用于读写文件、管道等。
2. Socket 专用 IO (recv/send)
ssize_trecv(intsockfd,void*buf,size_tlen,intflags);ssize_tsend(intsockfd,constvoid*buf,