多路IO复用--epoll

2024-04-25 20:44
文章标签 复用 io 多路 epoll

本文主要是介绍多路IO复用--epoll,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

        • api
        • 触发方式
        • service-epoll:

api
  • epoll_create(int size); // 创建epoll
  • epoll_ctl(int epfd,EPOLL_OP,sockfd,event); // 设置epoll, EPOLL_OP, 为epll操作事件,对应的fd
  • epoll_wait(epfd,events,length,0); // 将就绪队列从内核态到用户态

在内核中创建epoll,accept创建io,判断是否加入到内核中,每一次将就绪的io切换到用户态

触发方式

水平触发(LT) :满足IO复用条件即触发
边沿触发 (ET) : 新的IO就绪事件到达即触发

如客户端一次发送数据100个字节数据到服务端,服务端一次读50个字节,
服务器设置为水平触发,则recv执行2次,
服务器设置为边缘触发,则recv执行1次

使用场景: 对于发送的数据包较大,则设置为边缘触发触发,循环读取数据;数据包较小,则设置为水平触发

service-epoll:

运行服务端程序,将阻塞在epoll_wait,当客户端连接时,服务端接收客户端buffer,并发送buffer给客户端

	int sockfd= socket(AF_iNET,SOCK_STREAM,0);if(sockfd == -1) {return -1;}struct socketaddr_in servaddr;servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(9999);if(-1 = bind(sockfd,(struct sockaddr*)&servaddr),sizeof(servaddr)){return -2;}//nonblockint flag = fcntl(sockfd,F_GETFL,0);flag |= O_NONBLOCK;fcntl(sockfd,F_SETFL,flag);listen(sockfd,10);//epollint epfd = epoll_create(1);struct epoll_event ev;ev.events = EPOLLIN;ev.data.fd = sockfd;  // 8个字节epoll_ctl(epfd,EPOLL_CEL_ADD,sockfd,&ev); struct epoll_event events[1024] = {0}; // events快递员装快递的袋子struct sockaddr_in clientaddr;socklen_t len = sizeof(client);while(1) {  // loopint nready = epoll_wait(epfd,events,1024,-1);// 判读IO有没有就绪事件,快递员多长时间取快递  最后一个参数,-1 一直等待,0,不等待,1,等待一段时间if(nready < 0 ) continue;int i = 0;// set 链接额的客户端 ready 盒子for(i = 0; i< nready;i++) {int connfd = events[i].data.fd;if(sockfd == connfd) {int clientfd = accept(sockfd,(struct sockaddr *)clientaddr,&len);if(clientfd <= 0 ) {continue;}printf("clientfd = %d",clientfd);// EPOLLET 边沿触发ev.events = EPOLLIN | EPOLLET;ev.data.fd = clientfd;epoll_ctl(epfd,EPOLL_CTL_ADD,clientfd,&ev); }else if (events[i].events & EPOLLIN) {char buffer[BUFFER_LENGTH] = {0};int n = recv(connfd,buffer,BUFFER_LENGTH);if(n > 0) {// 服务器先接受客户端的buffer,再将buffer发送给客户端printf("recv : %s\n",buffer);send(connfd,buffer,n,0);} else if (n == 0) {printf("close\n");// 用户搬走epoll_ctl(epfd,EPOLL_CTL_DEL,connfd,NULL);// 如不移除,connfd的值将会一直存在close(connfd);}}}}

这篇关于多路IO复用--epoll的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935749

相关文章

vue同页面多路由懒加载-及可能存在问题的解决方式

先上图,再解释 图一是多路由页面,图二是路由文件。从图一可以看出每个router-view对应的name都不一样。从图二可以看出层路由对应的组件加载方式要跟图一中的name相对应,并且图二的路由层在跟图一对应的页面中要加上components层,多一个s结尾,里面的的方法名就是图一路由的name值,里面还可以照样用懒加载的方式。 页面上其他的路由在路由文件中也跟图二是一样的写法。 附送可能存在

Java——IO流(一)-(5/8):IO流概述、字节流-FileInputStream 每次读取一个字节

IO流概述 介绍 输入输出流,用于读写数据。 I指Input,称为输入流:负责把数据读到内存中去。 O指Output,称为输出流:负责写数据出去。 IO流的应用场景 文件内容的读写永久保存应用数据复制粘贴对话通信等等 怎么学IO流 理清楚IO六点分类和体系循序渐进、深入学习每个IO流的作用和用法 IO流的分类 IO流总体来看就有四大类: 字节输入流:以内存

【Linux】系统文件IO·文件描述符fd

前言  C语言文件接口  C 语言读写文件 1.C语言写入文件 2.C语言读取文件 stdin/stdout/stderr 系统文件IO 文件描述符fd: 文件描述符分配规则: 文件描述符fd: 前言 我们早在C语言中学习关于如何用代码来管理文件,比如文件的输入和文件的输出,一些文件的接口,如何深入学习文件的知识,在Linux下一切皆文件,今天我们探讨Linux的基础I/

linux关于epoll概述(各项组成,以及作用)

在 Linux 中,多个进程可以各自创建自己的 epoll 对象,每个进程都有独立的 epoll 实例,即拥有独立的 eventpoll 结构体和相关的数据结构(如红黑树、就绪列表等)。 当一个进程调用 epoll_create 函数时,Linux 内核会为该进程创建一个 eventpoll 对象。这个对象用于管理该进程所关注的文件描述符及其相关事件。 每个进程通过 epoll_ctl 函数向

多路h265监控录放开发-(12)完成全部开始录制和全部停止录制代码

xviewer.h 新增 public:void StartRecord();//126 开始全部摄像头录制void StopRecord();//126 停止全部摄像头录制 xviewer.cpp 新增//视频录制static vector<XCameraRecord*> records;//126void XViewer::StartRecord() //开始全部摄像头录

linux下I/O模型并发的epoll多进程池协程实现

方法1 主要思路: 定义了一个EventData结构体,用于存储事件相关的数据,如文件描述符、epoll 文件描述符、协程 ID 等。EchoDeal函数用于处理请求消息,并生成响应消息。handlerClient函数是协程的执行函数,用于处理客户端连接。它通过循环读取数据、解析请求、执行业务处理、发送响应等步骤,实现了对客户端请求的处理。handler函数是主函数,用于创建监听套接字、初始化

JavaIO流之创建字节输出流的2中方式

package fileoutputstream;import java.io.File;import java.io.FileOutputStream;public class FileOutputStreamDemo {public static void main(String[] args) throws Exception {//创建字节输出流对象方式1// FileO

JavaIO之删除指定目录(递归删除,先删除目录下的文件再删除目录)

package 输出指定文件绝对路径;import java.io.File;/** 需求:递归删除带内容的目录* * 目录我已经给定:demo* * 分析:* A:封装目录* B:获取该目录下的所有文件或者文件夹的File数组* C:遍历该File数组,得到每一个File对象* D:判断该File对象是否是文件夹* 是:回到B* 否:就删除*

第八章·Io流

Io流 文件流 文件与流 文件概念 属于文件的一种,与普通文件载体不同,文件是以硬盘为载体储存在计算机上的信息集合;是指存储在外部介质上的数据集合。可管理(增删改查),储存。 流概念 是指在计算机的输入/输出操作中各部件之间的数据流动,按照数据的传输方式分为 输入流(InputStream)----用来读取数据的输出流(OutputStream)----用来写出数据的 IO是输

React逻辑复用的方式都有哪些

在日常开发中,能够优雅的复用组件和逻辑,是优秀开发者的职责。在react中,复用逻辑的方式有很多,可以适用于不同的业务场景。今天说三个比较有代表性的,Render Props、HOC、Hooks Render Props 创建一个接受函数作为其子组件的prop的组件,该函数返回一个React元素。通过这种方式,父组件可以通过传递不同的函数来重用相同的逻辑。 示例代码: functio