C++面试题:recv和read的区别

devtools/2025/3/13 3:04:53/

recvread 都是用于从文件描述符读取数据的系统调用,但它们的设计目的和使用场景有所不同。以下是两者的主要区别:


1. 设计目的

recvread
专为套接字(socket)通信设计,属于 Berkeley 套接字 API 的一部分。通用的文件读取接口,属于 POSIX I/O 标准,适用于所有文件描述符(文件、管道、套接字等)。

2. 函数原型

// recv 原型(需要包含 <sys/socket.h>)
ssize_t recv(int sockfd, void *buf, size_t len, int flags);// read 原型(需要包含 <unistd.h>)
ssize_t read(int fd, void *buf, size_t count);

read

  • read 是一个通用的系统调用,用于从文件描述符中读取数据。它不仅可以用于网络套接字,也可以用于从普通文件或设备读取数据。

  • 参数:

    • fd:文件描述符,可以是普通文件、设备或网络套接字等。

    • buf:存储读取数据的缓冲区。

    • count:请求读取的字节数。

  • 返回值:成功时返回读取的字节数,失败时返回 -1,并设置 errno

recv

  • recv 是专门用于网络套接字编程的系统调用,通常用于从连接的套接字中读取数据。

  • 参数:

    • sockfd:套接字文件描述符。

    • buf:存储读取数据的缓冲区。

    • len:请求读取的字节数。

    • flags:控制数据接收的标志位,常用的标志有 MSG_PEEK(窥探数据,但不移除)和 MSG_WAITALL(等待完整的消息)。

  • 返回值:成功时返回读取的字节数,失败时返回 -1,并设置 errno

关键区别
  • flags 参数:recv 多了一个 flags 参数,允许对接收行为进行更精细的控制(见下文)。read 无此参数。

3. 控制选项(flags

recvflags 参数支持以下常用选项(按需组合):

标志说明
MSG_PEEK查看数据但不从接收缓冲区移除(下次调用仍会读到相同内容)。
MSG_WAITALL阻塞直到请求的字节数全部接收完成(除非发生错误或连接关闭)。
MSG_OOB接收带外数据(Out-of-Band Data,如 TCP 紧急数据)。
MSG_DONTWAIT非阻塞模式:即使套接字是阻塞的,本次调用也会立即返回(需检查 errno)。

read 没有这些控制选项,只能按默认行为读取数据。


4. 返回值与错误处理

recvread
成功:返回实际接收的字节数(可能小于请求的 len)。连接关闭:返回 0。错误:返回 -1,设置 errno(如 EAGAINECONNRESET)。成功:返回实际读取的字节数(可能小于请求的 count)。文件结束(EOF):返回 0。错误:返回 -1,设置 errno
共同行为
  • 两者在非阻塞模式下均可能返回 EAGAINEWOULDBLOCK(表示当前无数据可读)。

5. 适用场景

recvread
专门用于套接字通信(TCP/UDP)。需要精细控制接收行为(如窥探数据或接收紧急数据)。适用于所有文件描述符(文件、管道、套接字等)。简单读取数据,无需特殊控制。

6. 示例对比

使用 recv 接收数据:
char buffer[1024];
ssize_t n = recv(sockfd, buffer, sizeof(buffer), MSG_PEEK);
if (n == -1) {// 处理错误
} else if (n == 0) {// 连接已关闭
} else {// 处理数据(数据仍在接收缓冲区中)
}
使用 read 读取套接字:
char buffer[1024];
ssize_t n = read(sockfd, buffer, sizeof(buffer));
if (n == -1) {// 处理错误
} else if (n == 0) {// 连接已关闭
} else {// 处理数据(数据已从接收缓冲区移除)
}

7. 关键总结

特性recvread
设计目标面向网络通信(套接字)通用文件/设备读取
控制选项支持 flags 参数
头文件<sys/socket.h><unistd.h>
使用场景需精细控制接收行为时简单读取所有类型文件描述符

何时选择?

  • 优先 recv:在套接字编程中需要控制接收行为(如窥探数据、接收带外数据或非阻塞操作)。

  • 使用 read:对套接字进行简单读取,或兼容非网络文件描述符(如文件、管道)。


http://www.ppmy.cn/devtools/166663.html

相关文章

贪心算法精解:用C++征服最优解问题

贪心算法精解&#xff1a;用C征服最优解问题 一、贪心算法的本质&#xff1a;当下最优即全局最优 贪心算法如同下棋高手&#xff0c;每一步都选择当前最优的走法。它的核心思想是&#xff1a;通过局部最优选择的叠加&#xff0c;最终得到全局最优解。这种算法在时间复杂度上往…

【漫话机器学习系列】132.概率质量函数(Probability Mass Function, PMF)

概率质量函数&#xff08;Probability Mass Function, PMF&#xff09;详解 1. 概述 概率质量函数&#xff08;PMF, Probability Mass Function&#xff09;用于描述离散随机变量的概率分布。简单来说&#xff0c;它给出了随机变量取某个具体值的概率。PMF 适用于那些只能取有…

【含文档+PPT+源码】基于微信小程序的乡村振兴民宿管理系统

项目介绍 本课程演示的是一款基于微信小程序的乡村振兴民宿管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该…

CentOS7离线部署安装docker和docker-compose

CentOS7离线部署安装docker和docker-compose 安装包准备 docker下载地址、docker-compose下载地址 docker和docker-compose版本对应关系 注&#xff1a;本次安装部署选择的版本是 docker&#xff1a;docker-28.0.1.tgzdocker-compose&#xff1a;docker-compose-linux-x86_6…

JAVA编程【JVM编程】

1. JVM 体系结构 JVM 主要包括以下几个核心部分&#xff1a; 类加载器&#xff08;ClassLoader&#xff09; 运行时数据区&#xff08;Runtime Data Area&#xff09; 执行引擎&#xff08;Execution Engine&#xff09; 本地方法接口&#xff08;Native Interface&#xff0…

今日头条文章爬虫教程

今日头条文章爬虫教程 随着互联网的发展&#xff0c;新闻资讯类平台如今日头条积累了海量的数据。对于数据分析师、研究人员等群体来说&#xff0c;获取这些数据进行分析和研究具有重要的价值。本文将介绍如何使用Python编写爬虫&#xff0c;爬取今日头条的文章数据。 一、准…

下一代AIGC一站式商业解决方案Chat Nio

简介 什么是 AIGC &#xff1f; AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;是“人工智能生成内容”的简称&#xff0c;指的是利用人工智能技术&#xff0c;通过算法和模型自动生成各种形式的内容&#xff0c;包括但不限于文本、图像、音频、视频…

react脚手架(creat-react-app)

安装 react脚手架 React官方提供的脚手架工程Create React App&#xff1a;https://github.com/facebook/create-react-app npm install create-react-app -g 全局安装 create-react-app my-react (my-react为项目名称&#xff0c;可以自定义) cd my-react 启动项目&#xff1a…