了解ET模式和LT模式:Linux网络编程中的事件触发方式
文章目录
- 概述
- 摘要
- 正文:
- 介绍
- ET模式(边缘触发)
- LT模式(水平触发 默认)
- 总结
概述
当谈到Linux网络编程中的ET(边缘触发)模式和LT(水平触发)模式时,我们需要理解它们在事件驱动编程中的作用和区别。下面是一篇详细解释这两种模式的博文,包含代码示例。
摘要
摘要: 在Linux网络编程中,ET(边缘触发)模式和LT(水平触发)模式是两种常用的事件触发方式。本文将详细介绍这两种模式的原理和使用场景,并提供相应的代码示例,帮助读者更好地理解和应用。
正文:
介绍
在事件驱动编程中,事件触发方式决定了何时和如何通知应用程序发生的事件。ET模式和LT模式是两种常见的事件触发方式,主要用于处理非阻塞I/O操作。
EPOLL事件有两种模型:
Edge Triggered (ET) :边缘触发只有数据到来才触发,不管缓存区中是否还有数据。
Level Triggered (LT) :水平触发只要有数据都会触发。
ET模式(边缘触发)
ET(edge-triggered):ET是高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知。请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only once).
下面是一个使用ET模式的示例代码片段,该代码使用epoll监听套接字并读取数据:
/* server.c */
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/epoll.h>
#include <unistd.h>
#include <fcntl.h>#define MAXLINE 10
#define SERV_PORT 8080int main(void)
{struct sockaddr_in servaddr, cliaddr;socklen_t cliaddr_len;int listenfd, connfd;char buf[MAXLINE];char str[INET_ADDRSTRLEN];int i, efd, flag;listenfd = socket(AF_INET, SOCK_STREAM, 0);bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));listen(listenfd, 20);struct epoll_event event;struct epoll_event resevent[10];int res, len;efd = epoll_create(10);/* event.events = EPOLLIN; */event.events = EPOLLIN | EPOLLET; /* ET 边沿触发 ,默认是水平触发 */printf("Accepting connections ...\n");cliaddr_len = sizeof(cliaddr);connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);printf("received from %s at PORT %d\n",inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),ntohs(cliaddr.sin_port));flag = fcntl(connfd, F_GETFL);//将其转化为no-blockflag |= O_NONBLOCK;fcntl(connfd, F_SETFL, flag);event.data.fd = connfd;epoll_ctl(efd, EPOLL_CTL_ADD, connfd, &event);while (1) {printf("epoll_wait begin\n");res = epoll_wait(efd, resevent, 10, -1);printf("epoll_wait end res %d\n", res);if (resevent[0].data.fd == connfd) {while ((len = read(connfd, buf, MAXLINE/2)) > 0)write(STDOUT_FILENO, buf, len);}}return 0;
}
LT模式(水平触发 默认)
LT模式在事件发生时会一直通知,直到应用程序将事件处理完毕。它不要求应用程序一直读取或写入数据,可以在每个事件通知中只处理一部分数据。LT模式适用于需要按需处理数据的场景,如批量数据处理、文件传输等。
下面是一个使用LT模式的示例代码片段,该代码使用epoll监听套接字并读取数据:
// 创建epoll实例
int epollfd = epoll_create1(0);// 添加监听套接字到epoll实例
struct epoll_event ev;
ev.events = EPOLLIN; // LT模式
ev.data.fd = sockfd;
epoll_ctl(epollfd, EPOLL_CTL_ADD, sockfd, &ev);// 循环监听事件并处理
while (1) {struct epoll_event events[MAX_EVENTS];int ready = epoll_wait(epollfd, events, MAX_EVENTS, -1);for (int i = 0; i < ready; i++) {if (events[i].events & EPOLLIN) {// 读取数据char buffer[READ_SIZE];int bytesRead = read(events[i].data.fd, buffer, READ_SIZE);// 处理数据// ...}}
}
总结
ET模式和LT模式是Linux网络编程中常用的事件触发方式。ET模式要求应用程序在读取或写入数据时必须一直进行操作,适用于需要及时处理全部数据的场景。LT模式允许应用程序按需处理数据,适用于需要按需处理数据的场景。理解并正确应用这两种模式,对于开发高效、可靠的网络应用程序至关重要。
通过以上详细的解释和代码示例,我们希望读者能够更好地理解ET模式和LT模式在Linux网络编程中的作用和区别。这两种模式的选择取决于具体的应用需求,开发者可以根据实际情况来决定使用哪种模式。
希望本文对您有所帮助,如果还有任何问题,请随时提问!
相关文章:
了解ET模式和LT模式:Linux网络编程中的事件触发方式
文章目录 概述摘要正文:介绍ET模式(边缘触发)LT模式(水平触发 默认) 总结 概述 当谈到Linux网络编程中的ET(边缘触发)模式和LT(水平触发)模式时,我们需要理解它们在事件…...
内部类和匿名类
目录 一、内部类 1.数据访问 2.静态内部类 二、内部类和外部类区别 1.访问修饰符: 2.static修饰: 3.使用: 三、匿名类 PS:小练习 一、内部类 内部类是指将一个类定义在另一个里面。 内部类分为static内部类和普通内部类。 public…...
RISC-V 中国峰会 | OpenMPL引人注目,RISC-V Summit China 2023圆满落幕
RISC-V中国峰会圆满落幕 2023年8月25日,为期三天的RISC-V中国峰会(RISC-V Summit China 2023)圆满落幕。本届峰会以“RISC-V生态共建”为主题,结合当下全球新形势,把握全球新时机,呈现RISC-V全球新观点、新…...
时空数据挖掘精选23篇论文解析【AAAI 2023】
今天和大家分享时空数据挖掘方向的资料。 时空数据挖掘是人工智能技术的重要分支,是一种采用人工智能和大数据技术对城市时空数据进行分析与挖掘的方法,旨在挖掘时空数据,理解城市本质,解决城市问题。 目前,时空数据…...
MySQL 存储过程和函数
目录 一、存储过程和函数概述 二、创建存储过程和函数 1、创建存储过程 2、创建存储函数 三、查看/调用储存过程和函数 1、查看储存过程/函数 2、调用储存过程/函数 四、修改/删除存储过程和函数 1、修改存储过程和函数 2、删除存储过程和函数 五、练习 一、存储过…...
ClickHouse 使用
CREATE DATABASE test on cluster ck_00_1repl; DROP TABLE local_t_ordt_order on cluster ck_00_1repl; 创建本地 local 表 CREATE TABLE test.local_order_db_t_order on cluster ck_00_1repl ( forder_id_hash String, forder_id String, fuid Int32, forder_type Int32…...
通过SSH协议连接远程服务器(Linux)
能够连接远程服务器的软件有很多,例如MobaXterm、Xshell、PuTTY、SecureCRT等。 以下是在Windows系统上通过SSH协议来连接Linux系统的操作过程: 在Linux系统上打开终端,输入ifconfig命令查看主机名;如果无法执行该命令ÿ…...
IPC之System V vs POSIX
文章目录 IPC示例共享内存POSIX shmSystem V shm IPC 当谈到IPC(Inter-Process Communication,进程间通信)时,它是指不同进程之间进行数据交换和通信的机制。 它允许在操作系统中运行的不同进程之间传输数据,这些进程…...
视频汇聚/视频云存储/视频监控管理平台EasyCVR安全检查的相关问题及解决方法
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...
分布式定时任务
分布式定时任务 背景xxl-job实战代码背景 在大多数业务场景中,非及时的数据同步,或者数据处理,都需要定时任务来处理 xxl-job 选型1.社区活跃度与文档完整度高 2.发迅速、学习简单、轻量级、易扩展 3.功能支持多 4.使用该框架的公司多,现登记有600多家公司已经应用该框架…...
国标GB28181视频平台EasyGBS视频监控平台无法播放,抓包返回ICMP排查过程
国标GB28181视频平台EasyGBS是基于国标GB/T28181协议的行业内安防视频流媒体能力平台,可实现的视频功能包括:实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。国标GB28181视频监控平台部署简单、可拓展性强,支持将…...
计算机毕设 基于深度学习的图像超分辨率重建 - opencv python cnn
文章目录 0 前言1 什么是图像超分辨率重建2 应用场景3 实现方法4 SRResNet算法原理5 SRCNN设计思路6 代码实现6.1 代码结构组织6.2 train_srresnet6.3 训练效果 7 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少…...
基于Java+SpringBoot+Vue前后端分离科研工作量管理系统设计和实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...
Java复习-17-Object类
Object 类 功能:可以解决参数的统一问题特点:Java中所有的类型都是 Object 类的子类(包括自定义的类)。运用:如果一个程序的方法要求可以接收所有类的对象的时候就可以利用 Object 实现处理。 toString() 方法 可以…...
数据结构--树4.2.4(树、森林即二叉树的相互转换(仅供参考))
目录 一、树转换成二叉树步骤 二、森林转换成二叉树 三、二叉树到树、森林的转换 一、树转换成二叉树步骤 分两个步骤: 1、在树中所有的兄弟结点之间加一连线。 2、对每个结点,除了保留与其长子(最左边)的连线外,去…...
MyBatis-Plus 总结
MyBatis-Plus简介 官网:https://baomidou.com/ GitHub:https://github.com/baomidou/mybatis-plus Gitee:https://gitee.com/baomidou/mybatis-plus 简介 MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具&#x…...
【CSS】轮播图案例开发 ( 基本设置 | 子绝父相 | 浏览器水平居中 | 圆角设置 | 绝对定位居中设置 )
代码示例 : <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Banner 轮播</title><style>/* 取消浏览器或者其它标签的默认的内外边距 */* {margin: 0;padding: 0;}/* 取消列表样式 主要是…...
leetcode做题笔记111. 二叉树的最小深度
给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 思路一:递归 int minDepth(struct TreeNode* root){if(!root)return 0;int leftminDepth(root->le…...
ubuntu安装Google Chrome 浏览器和ChromeDriver
要在Ubuntu上安装Google Chrome浏览器和ChromeDriver,可以按照以下步骤操作: 1. 安装Google Chrome 浏览器 下载Google Chrome 的最新版本。 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb使用dpkg安装下载的deb包。…...
猫头虎博主赠书一期:《Kubernetes原生微服务开发》
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
