当前位置: 首页 > 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.dtcms.com/a/333847.html

相关文章:

  • 自己开发的VIP monitor通过TLM port口连接到RefenceModel 但是get不出transaction的问题
  • 《中国棒球知识科普》国家级运动健将标准·棒球1号位
  • 力扣(接雨水)——标准双指针
  • 最长链(二叉树直径DFS)
  • 【学习笔记】NTP服务客户端配置
  • 医疗领域名词标准化工具
  • 二分算法(模板)
  • Vue插槽---slot详解
  • RAGFlow入门
  • 大麦APP抢票揭秘
  • 亚马逊新品推广的智能突围:从传统SP广告到DeepBI策略革新
  • 结合项目对AOP的实践和理论讲解-AOP八股
  • 第十四节:物理引擎集成:Cannon.js入门
  • Windows Server Core智能调优
  • 智能体开发实战:用Deepseek做一个生成思维导图的智能体
  • SSH协议的GIT转换
  • 访问者模式C++
  • Day55 Java面向对象09 super关键字详解
  • MySQL 高效查询五虎将——分页、排序、分组、去重、聚合函数实战手册
  • 解决HFSS许可证激活错误的实用方法
  • QT开发中QString是怎么转char*类型的
  • 轴机械臂cad【7张】三维图+设计说明书
  • 子进程资源回收与线程相关概念
  • 机器视觉助力柔性屏贴合工艺升级,精度可达0.01mm
  • 文章数据发布到苹果CMS(MacCMS)网站技巧
  • 深入理解Transformer:从训练机制到长文本处理的核心问题
  • Erlang notes[2]
  • Fastadmin后台列表导出到表格
  • 从理论到实战:KNN 算法与鸢尾花分类全解析
  • [Pyro概率编程] 推理算法Infer | 随机变分推断SVI | MCMC采样机制