news 2026/4/26 3:59:33

recv和send(及与read、write的区别)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
recv和send(及与read、write的区别)

recv

recv() 是 Linux 网络编程中用于从套接字接收数据的核心函数

#include<sys/socket.h>ssize_trecv(intsockfd,void*buf,size_t len,intflags);

参数说明

参数说明
sockfd套接字描述符(socket descriptor)
buf接收数据的缓冲区地址
len缓冲区最大长度
flags接收标志,控制接收行为

常用 Flags

// 组合使用时可使用按位或 (|)MSG_WAITALL// 等待所有请求数据到达(阻塞直到收到len字节)MSG_PEEK// 查看数据但不从接收队列移除MSG_OOB// 接收带外数据(out-of-band)MSG_DONTWAIT// 非阻塞接收MSG_NOSIGNAL// 不产生SIGPIPE信号

当 recv() 函数的 flags 参数为0时,表示使用默认的接收行为。这是最常用、最简单的调用方式 在实际编程中,约80%的情况使用flags=0,只有在需要特殊行为时才使用其他标志。

默认行为(flags = 0)意味着:

1.阻塞模式

// 如果套接字是阻塞的(默认),recv会一直等待直到:// - 有数据可读// - 连接关闭// - 发生错误ssize_t n=recv(sockfd,buf,len,0);// 阻塞直到有数据

2.无特殊标志

不启用以下任何特殊标志:

  • ❌ 不查看数据(非MSG_PEEK)
  • ❌ 不等待所有数据(非MSG_WAITALL)
  • ❌ 非阻塞操作(非MSG_DONTWAIT)
  • ❌ 不接收带外数据(非MSG_OOB)
  • ❌ 不抑制信号(非MSG_NOSIGNAL)

返回值

  • 成功:返回接收到的字节数(可能小于len)
  • 返回0:连接已关闭(对端调用close()或shutdown())
  • 返回-1:出错,通过errno获取具体错误码

常见问题及解决

  1. 粘包问题:通过协议设计解决(长度前缀、分隔符)
  2. 数据不完整:循环接收直到满足需求
  3. 阻塞时间过长:设置接收超时

send

Linux中send()函数用于通过已连接的套接字发送数据

#include<sys/types.h>#include<sys/socket.h>ssize_tsend(intsockfd,constvoid*buf,size_t len,intflags);

参数说明

1.sockfd(套接字描述符)

  • 已连接的套接字文件描述符
  • 对于TCP,必须是已成功连接(connect())的套接字
  • 对于UDP,可以是已连接(connect())的套接字

2.buf(数据缓冲区)

  • 指向要发送数据的缓冲区的指针

3.len(数据长度)

  • 要发送的数据字节数

4.flags(标志位)

常用标志:

  • 0:默认,阻塞模式
  • MSG_DONTWAIT:非阻塞操作
  • MSG_OOB:发送带外数据
  • MSG_NOSIGNAL:连接断开时不产生SIGPIPE信号
  • MSG_MORE:提示内核有更多数据要发送(TCP_CORK效果)

返回值

  • 成功:返回发送的字节数(可能小于len)
  • 失败:返回-1,设置errno

重要特性

1.阻塞 vs 非阻塞

  • 阻塞模式:缓冲区满时,send()会阻塞直到可以发送数据
  • 非阻塞模式:立即返回EAGAIN/EWOULDBLOCK(非阻塞模式下缓冲区满)

2.部分发送

  • send()可能只发送部分数据
  • 必须检查返回值并处理剩余数据

3.TCP与UDP的不同

  • TCP:保证数据顺序,可能分片
  • UDP:消息边界保持,但可能丢失

read、write、recv、send的区别

// 通用的I/O操作ssize_tread(intfd,void*buf,size_t count);ssize_twrite(intfd,constvoid*buf,size_t count);// 套接字专用的I/O操作ssize_trecv(intsockfd,void*buf,size_t len,intflags);ssize_tsend(intsockfd,constvoid*buf,size_t len,intflags);

read、write和recv、send只差一个参数flags

主要区别

特性read/writerecv/send
适用范围所有文件描述符仅套接字描述符
标志位无flags参数有flags参数控制行为
中断处理可能被信号中断支持MSG_WAITALL等高级选项
连接状态更通用支持面向连接的语义
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 17:06:37

系统崩溃根因定位:AI辅助故障诊断实践

系统崩溃根因定位&#xff1a;AI辅助故障诊断实践 在一次深夜的线上事故中&#xff0c;某大型云服务平台突然出现大规模服务降级。监控系统显示多个微服务响应延迟飙升&#xff0c;但日志中并未记录明显错误信息。运维团队紧急排查网络、数据库和中间件后仍无法锁定问题源头—…

作者头像 李华
网站建设 2026/4/18 10:49:57

专利侵权比对分析系统:知识产权保护利器

专利侵权比对分析系统&#xff1a;知识产权保护利器 在当今全球科技创新竞争日益激烈的背景下&#xff0c;企业对专利资产的依赖程度前所未有。然而&#xff0c;面对每年数以百万计新增公开的专利文档&#xff0c;如何高效识别潜在的技术侵权风险&#xff0c;已成为知识产权管理…

作者头像 李华
网站建设 2026/4/23 16:46:38

异常登录行为检测:账户安全的隐形卫士

异常登录行为检测&#xff1a;账户安全的隐形卫士 在今天&#xff0c;一次看似普通的用户登录背后&#xff0c;可能正隐藏着一场自动化撞库攻击。黑客利用从暗网获取的千万级账号密码组合&#xff0c;在多个平台反复尝试——而防御这一切的关键&#xff0c;并非更复杂的验证码&…

作者头像 李华
网站建设 2026/4/19 5:19:18

疫情防控流调辅助系统:保护隐私的同时提效

疫情防控流调辅助系统&#xff1a;如何在保护隐私的同时实现效率跃升 在2020年疫情暴发初期&#xff0c;许多城市曾面临这样的困境&#xff1a;一个确诊病例的出现&#xff0c;往往需要数十名流调人员连续工作数小时甚至更久&#xff0c;通过电话回溯其过去14天的行程轨迹、接…

作者头像 李华
网站建设 2026/4/23 16:23:52

企业RAG系统优化全攻略:实现高效落地的关键手段!

一、先搞懂&#xff1a;RAG 优化的核心目标 RAG&#xff08;检索增强生成&#xff09;的核心流程很简单&#xff1a;用户提问→检索知识库→拼接 Prompt→LLM 生成。但落地时总会遇到三类问题&#xff1a;检索不准、检索不全、生成不稳。 所以企业落地 RAG 优化的本质&#xf…

作者头像 李华
网站建设 2026/4/17 16:34:36

美食菜谱推荐系统升级:结合口味偏好的精准推送

美食菜谱推荐系统升级&#xff1a;结合口味偏好的精准推送 在智能厨房设备逐渐走入家庭的今天&#xff0c;用户不再满足于“热门菜谱排行”或“关键词搜索”的粗放式推荐。当一位用户对语音助手说“我今晚想吃点辣的&#xff0c;但别太油”&#xff0c;系统如果只能返回一堆川湘…

作者头像 李华