随笔-网络编程-epoll水平触发和边缘触发
对于数据读取和发送的,水平触发和边缘触发的区别:
- 关于数据的读比较好理解,无论是LT模式还是ET模式,监听到读事件从socket开始读数据就好了,只不过读的逻辑有些差异,LT模式下,读事件触发后,可以按需收取想要的字节数,不用把本次接收到的数据收取干净,ET模式下,读事件触发后通常需要数据一次性收取干净。
- 而数据的写不太容易理解,因为数据的读是对端发来数据导致的,而数据的写其实是自己的逻辑层触发的,所以在通过网络发数据时通常都不会去注册监可写事件,一般都是调用 send 或者 write 函数直接发送,如果发送过程中, 函数返回 -1,并且错误码是 EWOULDBLOCK 表明发送失败,此时才会注册监听可写事件,并将剩余的服务存入自定义的发送缓冲区中,等可写事件触发后再接着将发送缓冲区中剩余的数据发送出去。
+++
常规设计:水平触发和边缘触发选择(对于【读】设计,【写】为直接调用send write):
关于监听fd:
对于监听的sock,最好使用水平触发模式,边缘触发模式会导致高并发情况下,有的客户端会连接不上。如果非要使用边缘触发,网上有的方案是用while来循环accept()。
关于read数据:
使用水平触发
使用水平触发的风险是如果上层应用没有去read 数据,就会一直触发; 但是,只要底层的框架设计好收到消息都会去读消息,那么也就没有这种风险
- 前言:用户场景,报文不会太大,所以用户层的缓冲区是固定大小,超过大小的报文视为异常报文,丢弃
- 使用边缘触发,未读完数据,会影响后续的报文的读取,所以选择水平触发
- 使用水平触发的风险是如果上层应用没有去read 数据,就会一直触发; 但是,只要底层的框架设计好收到消息都会去读消息,那么也就没有这种风险
- 只需要监听READ核CLOSE时间(WRITE不用)
本文来自博客园,作者:LiYanbin,转载请注明原文链接:https://www.cnblogs.com/stellar-liyanbin/p/18190808
分类:
笔记-系统|网络编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统