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

相关文章

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/

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

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

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

Portainer.io安装并配置Docker远程访问及CA证书

Portainer.io安装并配置Docker远程访问及CA证书 文章目录 Portainer.io安装并配置Docker远程访问及CA证书一.安装 Portainer.io2.启动容器 二.docker API远程访问并配置CA安全认证1.配置安全(密钥)访问2.补全CA证书信息3.生成server-key.pem4.创建服务端签名请求证书文件5.创建服务端扩展配置文件 extfile.

【Linux】基础IO_3

文章目录 六、基础I/O3. 软硬链接4. 动静态库 未完待续 六、基础I/O 3. 软硬链接 使用 ln 就可以创建链接,使用 ln -s 可以创建软链接,直接使用 ln 则是硬链接。 我们对硬链接进行测试一下: 根据测试,我们知道了 硬链接就像一个重命名一样,向其中一个文件里面写,另一个也会改变 。但是删除后只会删除一个,这说明 文件的删除本质上是减少硬链接数。硬