多路IO复用--Poll

2024-04-29 18:20
文章标签 复用 io 多路 poll

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

poll

相对与select 优点:

  1. 定义简单,只需要数组
  2. pollfd结构包含了要监视的events和内核返回的的revent,不再使用select“参数-值”传递的方式. 接口使用比select更方便

缺点:

  1. poll返回后,需要轮询pollfd来获取就绪的描述符,对IO的数量有限制,IO数量越多,性能越差
api
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
  • fds是一个poll函数监听的结构列表. 每一个元素中, 包含了三部分内容: 文件描述符, 监听的事件集合, 返回的事件集合.
  • nfds表示fds数组的长度
  • timeout表示poll函数的超时时间, 单位是毫秒
  • return: 返回值大于0, 表示poll由于监听的文件描述符就绪而返回

pollfd结构:

 struct pollfd {int fd; /* file descriptor */short events; /* requested events */short revents; /* returned events */
};
fd是哪个文件描述符,events:用户告诉内核你要帮我关注哪个文件描述符上的什么事件,revent:内核告诉用户,文件描述符上的事件已经就绪了

events和revents的取值:
POLLIN:数据(包括普通数据和优先数据), 可读可写

code
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/epoll.h>
#include <string.h>
int main() {int listenfd = socket(AF_INET, SOCK_STREAM, 0);  // if (listenfd == -1) return -1;struct sockaddr_in servaddr;servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(9999);if (-1 == bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))) {return -2;}listen(listenfd, 10);struct pollfd fds[POLL_SIZE] = {0};fds[sockfd].fd =sockefd;fds[sockfd].events = POLLIN;int maxfd = sockfd;int clientfd = 0;while (1) {int nready = poll(fds,maxfd+1,-1);if (fds[sockfd].revents & POLLIN) {clientfd = accept(listenfd, (struct sockaddr*)&client, &len);fds[clientfd].fd = clientfd;fds[clientfd].events = POLLIN;if(clientfd > maxfd)maxfd = clientfd;if(--nready) continue;} int i = 0;for (i = 0; i <= maxfd;i ++) {if(fds[i].revents & POLLIN) {char buffer[1024] = {0};int ret = recv(clientfd,buffer,1024,0);if(ret == 0) {fds[clientfd].fd = -1;close(clientfd);break;}printf("ret = %d, buffer:%s\n",ret,buffer);send(clientfd,buffer,ret,0);}}}
}

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



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

相关文章

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给其他应用程序运行,直到有准备就绪的描述符 或 超时

android java.io.IOException: open failed: ENOENT (No such file or directory)-api23+权限受权

问题描述 在安卓上,清单明明已经受权了读写文件权限,但偏偏就是创建不了目录和文件 调用mkdirs()总是返回false. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_E

JavaEE-文件操作与IO

目录 1,两种路径 二,两种文件 三,文件的操作/File类: 1)文件系统操作 File类 2)文件内容操作(读文件,写文件) (1)打开文件 (2)关闭文件 (3)读文件/InputStream (4)写文件/OutputStream (5)读文件/reader (6)写文件/writer (7)Scanner 四,练习: 1,两种路径 1)绝对路径