多路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

相关文章

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

Python文件操作与IO流的使用方式

《Python文件操作与IO流的使用方式》:本文主要介绍Python文件操作与IO流的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python文件操作基础1. 打开文件2. 关闭文件二、文件读写操作1.www.chinasem.cn 读取文件2. 写

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

springboot体会BIO(阻塞式IO)

使用springboot体会阻塞式IO 大致的思路为: 创建一个socket服务端,监听socket通道,并打印出socket通道中的内容。 创建两个socket客户端,向socket服务端写入消息。 1.创建服务端 public class RedisServer {public static void main(String[] args) throws IOException {

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds  总结  fd_set操作接口  timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充  获取新连接 注意点 -- 通信时的调用函数 添加新fd到

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

C++ I/O多路复用 select / poll / epoll

I/O多路复用:在网络I/O中,用 1个或1组线程 管理 多个连接描述符。             如果有至少一个描述符准备就绪,就处理对应的事件             如果没有,就会被阻塞,让出CPU给其他应用程序运行,直到有准备就绪的描述符 或 超时