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

epoll发数据学习

1、概述

发数据流程如下,下面问题你会怎么回答?

1、第一次为什么不是先注册可写事件,等可写事件触发后再发数据,而是直接发送数据?

2、如何表明当前数据一次性没有发完?

3、剩下的数据应该缓存到哪里?

4、如果当前已经有部分数据发不出去,业务层又来新的数据了,这些新数据应该缓存在哪里?

5、如果可写事件一直不触发,怎么办?有这种情况么?

2、分析

1、为什么不是先注册可写事件,等可写事件触发后再发数据,而是直接发送数据?

通常fd都是可写的,无需第一次注册可写事件

2、如何表明当前数据一次性没有发完?

send返回失败并且错误码是EWOULDBLOCK或EAGAIN,表示当前缓冲区已满,数据无法发出。
不一定第一次调用send就返回-1,有可能多次发送大量数据,可能返回-1;

3、剩下的数据应该缓存到哪里?

剩余的数据应该放入发送缓冲区

4、如果当前已经有部分数据发不出去,业务层又来新的数据了,这些新数据应该缓存在哪里?

新数据应该放在发送缓冲区,必须放在刚才未发完数据的后面

5、如果可写事件一直不触发,怎么办?有这种情况么?

有这种情况,有俩种场景。
第一种:滞留数据时间较长。比如:客户端断网、崩溃,服务器尝试发送,send一直返回EAGAIN

第二种:滞留的数据较大,比如:服务器每次发500个字节,客户端每次接收100个字节。

需要定时器,检测每个socket对应的发送缓冲区中的数据滞留情形,及时关闭链路。

留给读者留思考

1、上述5个问题对应的代码怎么写?

2、客户端给服务端发送一个包,然后再也不发送了,服务端需要怎么处理这个链接?

3、数据发送完,需要及时取消写事件(水平模式),为什么?


学习链接:https://github.com/0voice

http://www.lryc.cn/news/621974.html

相关文章:

  • Flink中的处理函数
  • 【完整源码+数据集+部署教程】小鼠行为识别系统源码和数据集:改进yolo11-RFAConv
  • JavaScript 原型机制详解:从概念到实战(附个人学习方法)
  • Flink中基于时间的合流--双流联结(join)
  • Java集合Map与Stream流:Map实现类特点、遍历方式、Stream流操作及Collections工具类方法
  • Transformer实战(11)——从零开始构建GPT模型
  • 【入门级-算法-6、排序算法:排序的基本概念冒泡排序】
  • 【100页PPT】数字化转型某著名企业集团信息化顶层规划方案(附下载方式)
  • Redis入门和简介
  • LeetCode 刷题【42. 接雨水】
  • 基于51单片机声控灯设计 智能声音+光线控制 楼道灯 声控开关
  • RabbitMQ面试精讲 Day 23:分布式事务与可靠投递
  • 【Redis】分布式系统的演化过程
  • [Oracle数据库] Oracle 常用函数
  • 接口芯片断电高阻态特性研究与应用分析
  • 基于 ArcFace/ArcMargin 损失函数的深度特征学习高性能人脸识别解决方案
  • 解释器模式C++
  • EN 61547照明产品的电磁兼容抗干扰标准
  • 图数据库如何构筑 Web3 风控防线 聚焦批量注册与链上盗转 悦数图数据库
  • eBPF技术介绍
  • 【Java】HashMap的详细介绍
  • YAML:锚点深度解析,告别重复,拥抱优雅的配置艺术
  • 【Java Web 快速入门】十、AOP
  • 「 CentOS7 安装部署k8s」
  • 水环境遥感分析!R语言编程+多源遥感数据预处理;水体指数计算、水深回归分析、水温SVM预测、水质神经网络建模及科研级可视化制图
  • 关于simplifyweibo_4_moods数据集的分类问题
  • 云原生俱乐部-k8s知识点归纳(3)
  • 2025年中国AI算力基础设施发展趋势洞察
  • MySQL 全面指南:从入门到精通——深入解析安装、配置、操作与优化
  • Linux 进程、线程与 exec/系统调用详解