news 2026/8/22 21:19:27

TCP网络编程核心:内核缓冲区与 Recv/Send 实战详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TCP网络编程核心:内核缓冲区与 Recv/Send 实战详解

在网络编程中,很多初学者会误以为:调用write就是把数据直接发到了网线上,调用read就是直接从网线上抓取数据。

事实并非如此。你的程序其实是在和操作系统的内核缓冲区打交道。

一、 核心机制:套接字中的文件描述符与缓冲区

当服务器通过accept建立连接,或客户端通过connect连接成功后,双方都获得了一个用于通信的文件描述符(File Descriptor)。

1. 两个 FD 的区别(服务器端)

  • 监听 FD (lfd)
    • 来源socket()->bind()->listen()
    • 作用:只负责在那“站岗”,通过accept()接受新的连接请求。
    • 读缓冲区:存储的是待处理的新连接请求(已完成三次握手)。
  • 通信 FD (cfd)
    • 来源accept()的返回值。
    • 作用:专门负责和某一个特定的客户端进行数据传输。
    • 读缓冲区:存储的是客户端发来的数据

2. 双向缓冲机制

每一个通信 FD在内核中都维护着两块内存区域:

  • 写缓冲区 (Write Buffer)
    • 当你调用write/send时,数据只是从应用程序被拷贝到了这个缓冲区。
    • 内核协议栈会在合适的时机(自动)将数据打包通过网络发送出去。
  • 读缓冲区 (Read Buffer)
    • 网卡收到的数据,由内核接收并存放在这里。
    • 当你调用read/recv时,你是从这里拿走数据。

TCP 的流式特性:正因为有缓冲区的存在,收发两端的数据量可以不对等

  • 例如:客户端每 5 秒发送 4KB 数据。
  • 服务器端:可以每秒读取 100 字节,只要缓冲区没溢出,数据就不会丢。

二、 函数对比:Read/Write vs Recv/Send

在 Linux 网络编程中,标准文件 IO 函数和 Socket 专用 IO 函数经常混用。

1. 接收数据

// 标准文件IOssize_tread(intfd,void*buf,size_tcount);// Socket专用ssize_trecv(intsockfd,void*buf,size_tlen,intflags);
  • 区别recv多了一个flags参数。
  • flags:通常设置为0。此时recv等同于read
  • 常用 flagMSG_PEEK(查看数据但不从缓冲区取出)、MSG_DONTWAIT(非阻塞模式)。

2. 发送数据

// 标准文件IOssize_twrite(intfd,constvoid*buf,size_tcount);// Socket专用ssize_tsend(intsockfd,constvoid*buf,size_tlen,intflags);
  • 同理,当flags为 0 时,send等同于write

三、 代码实战:使用 Recv/Send 实现数据传输

我们将编写一个简单的 Echo 服务器和客户端,演示recvsend的使用,以及connect的连接流程。

1. 服务器端 (server_recv.c)

服务器负责接收客户端发来的数据,并原样发回。

#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 19:05:58

从ACPI!AMLILoadDDB中的ACPI!SyncLoadDDB到ACPI!ACPICallBackLoad

从ACPI!AMLILoadDDB中的ACPI!SyncLoadDDB到ACPI!ACPICallBackLoadrc LoadDDB(pctxt,pDSDT, gpnsNameSpaceRoot, &powner);if (rc STATUS_SUCCESS){rc SyncLoadDDB(pctxt);}#ifdef DEBUG{KIRQL oldIrql;gdwfAMLI & ~AMLIF_LOADING_DDB;KeAcquireSpinLock( &gdw…

作者头像 李华
网站建设 2026/8/21 13:33:30

YOLOv11_OBB(目标旋转框)模型从标签制作到训练推理

前言 由于目前全网大都是水平框检测的教程&#xff0c;本博客使用YOLOv11_OBB检测&#xff0c;从打标签&#xff0c;到训练自己的数据集&#xff0c;显示目标的旋转框检测教程。 目标检测框和目标旋转框的区别&#xff1a; 旋转边界框&#xff08;OBB&#xff09;包含一个额外的…

作者头像 李华
网站建设 2026/8/21 13:33:29

python基于django人口户籍管理系统设计与实现

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着城市化进程的加快和人口流动性的增强&#xff0c;传统的人工户籍管理方式已难以满足现代社会的需求。为提高户籍管…

作者头像 李华
网站建设 2026/8/21 13:34:08

python基于django框架的健康档案网站的设计与实现

目录健康档案网站的设计与实现摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;健康档案网站的设计与实现摘要 基于Django框架的健康档案网站旨在为用户提供便捷的个人健康数据管…

作者头像 李华
网站建设 2026/8/22 15:31:52

《创业之路》-863-基业长青 =为企业基业长青的终极实战操作系统,首次将 「四阶价值流 × 商业模式画布 × 产品生命周期 × 创新 × 技术曲线 × 第二增长曲线 × 上中下游生态」 七大工具深度

企业基业长青的终极实战操作系统&#xff0c;我们首次将 「四阶价值流 商业模式画布 产品生命周期 创新 技术曲线 第二增长曲线 上中下游生态」 七大工具深度耦合&#xff0c;形成可量化、可执行、可预警的企业生存指南。框架核心逻辑&#xff1a;基业长青 用生态控制力…

作者头像 李华