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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1167910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 在一次 http 请求中耗费了多少内存?

SpringBoot 在一次 http 请求中耗费了多少内存&#xff1f;先说说为啥会关心这个问题先搞懂&#xff1a;一次 HTTP 请求&#xff0c;SpringBoot 到底在干啥&#xff1f;动手测&#xff1a;最简单的接口&#xff0c;到底耗多少内存&#xff1f;第一步&#xff1a;准备测试代码第…

Socket 编程客户端篇:Connect 隐式绑定与数据发送实战

各类资料学习下载合集 链接:https://pan.quark.cn/s/7c8c391011eb Socket 编程客户端篇:Connect 隐式绑定与数据发送实战 如果说服务器是“坐地经营”的店家(被动等待),那么客户端就是“上门拜访”的顾客(主动发起)。在 Socket 编程中,客户端的开发流程相对简洁,但其…

茶叶商城|基于springboot 茶叶商城系统(源码+数据库+文档)

茶叶商城 目录 基于springboot vue茶叶商城系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue茶叶商城系统 一、前言 博主介绍&#xff1a;✌️大…

294. Java Stream API - 对流进行归约

文章目录294. Java Stream API - 对流进行归约&#x1f3af; 什么是归约&#xff08;Reduction&#xff09;&#xff1f;✅ 什么是终端操作&#xff1f;&#x1f514; 注意事项&#xff1a;&#x1f9e0; 使用 BinaryOperator 对流进行归约&#x1f9ea; 示例一&#xff1a;经典…

百考通AI开题报告功能:智能构建研究蓝图,轻松搞定高质量开题

撰写开题报告&#xff0c;是每位学生迈入正式研究前必须跨越的关键门槛。它不仅要清晰界定研究问题&#xff0c;还需系统梳理文献、科学设计方法、合理规划路径&#xff0c;并阐明研究价值——任何一个环节的疏漏&#xff0c;都可能导致开题受阻。然而&#xff0c;面对繁杂的学…

百考通AI开题报告功能:用智能写作破解“开题难”,高效开启科研之旅

“开题报告怎么写&#xff1f;”——这是无数学生在科研起步阶段最常面临的困惑。选题方向模糊、文献综述杂乱、研究方法空泛、逻辑结构松散……这些问题不仅拖慢进度&#xff0c;还容易导致开题反复修改甚至被退回。如今&#xff0c;百考通AI平台推出的“开题报告”写作功能&a…

农产品销售数据分析|基于Python 农产品销售数据分析系统(源码+数据库+文档)

农产品销售数据分析 目录 基于PythonDjango农产品销售数据分析系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于PythonDjango农产品销售数据分析系统 一、前言 博…

百考通AI开题报告功能:智能生成专业框架,让开题写作事半功倍

开题报告是学术研究的“第一块基石”&#xff0c;它不仅决定课题能否顺利立项&#xff0c;更直接影响后续研究的深度与方向。然而&#xff0c;对许多学生而言&#xff0c;撰写开题报告却是一场充满挑战的“硬仗”&#xff1a;选题太大难以聚焦、文献堆砌缺乏主线、研究方法描述…

基于STM32的车内环境检测和儿童滞留报警系统(开题报告)

本科毕业论文(设计)开题报告 姓名 学号 专业 通信工程 题目 基于STM32的车内环境检测和儿童滞留报警系统 选题意义、研究现状及可行性分析 1、选题意义 汽车在给人们出行带来便利的同时也引发了一些儿童安全问题,尤其是由于父母的疏忽导致儿童被锁车内致危的事件频发。儿童滞…

ACPI!ACPIBuildProcessRunMethodPhaseCheckSta和ACPI!ACPIGetConvertToDevicePresence调试断点搜集

ACPI!ACPIBuildProcessRunMethodPhaseCheckSta和ACPI!ACPIGetConvertToDevicePresence调试断点搜集ACPI!ACPIBuildDeviceExtension ACPI!ACPIDetectPdoDevices ACPI!ACPIDetectPdoDevices0x122ACPI!ACPIBuildDeviceDpcACPI!ACPIBuildProcessGenericList 关键1 ACPI!ACPI…

校园食堂点餐|基于Python 校园食堂点餐系统(源码+数据库+文档)

校园食堂点餐 目录 基于PythonDjango校园食堂点餐系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于PythonDjango校园食堂点餐系统 一、前言 博主介绍&#xff1a…

python基于django校园二手交易平台管理系统

目录基于Django的校园二手交易平台管理系统摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于Django的校园二手交易平台管理系统摘要 校园二手交易平台是为高校学生提供的便捷…

百考通AI开题报告功能:告别“开题卡壳”,智能生成逻辑清晰、结构完整的专业初稿

对许多学生来说&#xff0c;开题报告是毕业路上的第一道“难关”——明明有研究想法&#xff0c;却不知如何系统表达&#xff1b;读了不少文献&#xff0c;却理不清研究脉络&#xff1b;想设计方法&#xff0c;却写得空洞模糊。结果往往是反复修改、进度拖延&#xff0c;甚至因…

计算机毕业设计hadoop+spark+hive旅游推荐系统 旅游可视化系统 地方旅游网站 旅游爬虫 旅游管理系统 大数据毕业设计 机器学习 深度学习 知识图谱

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 技术范围&#xff1a;Sprin…

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

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

从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…

百考通AI开题报告功能:智能构建学术起点,让高质量开题触手可及

开题报告是科研工作的“导航图”&#xff0c;它不仅框定研究边界、明确问题意识&#xff0c;还体现研究者的逻辑思维与学术素养。然而&#xff0c;现实中许多学生在撰写时常常陷入“有想法却写不出”“读了很多却理不清”“方法模糊结构散”的困境&#xff0c;导致开题反复修改…

IP分片与组装

IP 分片是 TCP/IP 协议栈中网络层&#xff08;IP 层&#xff09;的核心机制&#xff0c;目的是解决 “IP 报文长度超过数据链路层 MTU 限制” 的传输问题 —— 确保大型 IP 数据报能通过不同 MTU 的网络链路&#xff08;如以太网、PPP 链路&#xff09;成功送达目标主机。以下从…

jQuery 版本文件及相关信息汇总

一、核心结论​ 截至2025年1月&#xff0c;jQuery 的最新稳定版本为 3.7.1&#xff08;2023年7月发布&#xff09;&#xff0c;4.0 版本仍处于测试阶段&#xff08;2025年8月发布 Release Candidate 1&#xff0c;未正式推出&#xff09;。当前主流使用的版本为 3.x 系列&…

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

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