当前位置: 首页 > news >正文

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.jsqmd.com/news/252631/

相关文章:

  • SpringBoot 在一次 http 请求中耗费了多少内存?
  • Socket 编程客户端篇:Connect 隐式绑定与数据发送实战
  • 茶叶商城|基于springboot 茶叶商城系统(源码+数据库+文档)
  • 294. Java Stream API - 对流进行归约
  • 百考通AI开题报告功能:智能构建研究蓝图,轻松搞定高质量开题
  • 百考通AI开题报告功能:用智能写作破解“开题难”,高效开启科研之旅
  • 农产品销售数据分析|基于Python 农产品销售数据分析系统(源码+数据库+文档)
  • 百考通AI开题报告功能:智能生成专业框架,让开题写作事半功倍
  • 基于STM32的车内环境检测和儿童滞留报警系统(开题报告)
  • ACPI!ACPIBuildProcessRunMethodPhaseCheckSta和ACPI!ACPIGetConvertToDevicePresence调试断点搜集
  • 校园食堂点餐|基于Python 校园食堂点餐系统(源码+数据库+文档)
  • python基于django校园二手交易平台管理系统
  • 百考通AI开题报告功能:告别“开题卡壳”,智能生成逻辑清晰、结构完整的专业初稿
  • 计算机毕业设计hadoop+spark+hive旅游推荐系统 旅游可视化系统 地方旅游网站 旅游爬虫 旅游管理系统 大数据毕业设计 机器学习 深度学习 知识图谱
  • YOLOv11_OBB(目标旋转框)模型从标签制作到训练推理
  • 从ACPI!AMLILoadDDB中的ACPI!SyncLoadDDB到ACPI!ACPICallBackLoad
  • 百考通AI开题报告功能:智能构建学术起点,让高质量开题触手可及
  • IP分片与组装
  • python基于django框架的健康档案网站的设计与实现
  • jQuery 版本文件及相关信息汇总
  • ARP欺骗的原理与防御措施
  • python基于django框架的大学生平时成绩管理系统 四个角色45s2bez3
  • 百考通AI开题报告功能:让开题写作从“压力源”变为“加速器”
  • springboot基于微信小程序的粤语文化传播平台的设计与开发
  • JavaScript 中实现 a.js调用 b.js函数教程
  • springboot基于微信小程序的云浮市特色农产品交易的设计与实现
  • python基于django框架的新能源汽车之家系统设计与实现
  • JavaScript 中定义全局变量的教程
  • springboot基于小程序的智能雨伞借取管理系统设计实现
  • 【实践】利用 Prettier 格式化打包后的代码?修 BUG 的隐藏神器!