高级IO_多路转接之Poll

文章目录

  • 前言
  • 一、poll
  • 二、poll使用步骤
  • 总结


前言

上一章我们学习了select,但是select作为早期的多路转接接口,缺点十分明显,于是又出现poll和epoll等接口,今天我们就来学习一下poll的使用


提示:以下是本篇文章正文内容,下面案例可供参考

一、poll

在这里插入图片描述
参数struct pollfd *fds,它其实传的是一个struct pollfd数组,其结构体成员介绍如下。

  • fd设置为要关心的fd;
  • events是一个输入型参数,用来告知poll要关心的事件,比如说POLLIN就是让它关心读事件;
  • revents是一个输出型参数,当poll检测到关心的fd有events的资源就绪时,就会返回并将该fd对应的revents设置为就绪events。

之前我们使用select,还需要用到一个辅助数组来保存我们需要关心的fds,因为它的大部分参数都是输入输出型参数。而poll采用了struct pollfd结构体的方式让输入输出型参数分离互不影响,也是弥补了select的这一缺点。

参数nfds_t nfds,它用于告知poll需要关心的fd数量,其实就是fds数组的元素个数。

参数int timeout,功能上与select的timeout一样,不过poll舍弃了传struct timeval结构体的方式,直接传一个int整形就可以了,其单位为ms。

二、poll使用步骤

poll的使用步骤与select类似。

#include "Socket.hpp"
#include <poll.h>#define MAX_POLLFDS 1024
#define INVALID_FD -1const std::string default_ip = "0.0.0.0";
const uint16_t default_port = 8080;class PollServer
{
public:PollServer(uint16_t port = default_port): _port(port) {}inline void InitFds(){_pollfds[0].fd = _listensock._sockfd;_pollfds[0].events = POLLIN;for (int i = 1; i < MAX_POLLFDS; ++i){_pollfds[i].fd = INVALID_FD;}}void Init(){_listensock.Init();_listensock.Bind(AF_INET, default_ip, _port);_listensock.Listen();InitFds();}void Print(){std::cout << "现有fds: ";for (int i = 0; i < MAX_POLLFDS; ++i){if (_pollfds[i].fd == INVALID_FD){continue;}std::cout << _pollfds[i].fd << " ";}std::cout << std::endl;}void Accepter(){struct sockaddr_in tmp;socklen_t len = sizeof tmp;int newfd = accept(_listensock._sockfd, (struct sockaddr *)&tmp, &len);for (int i = 0; i < MAX_POLLFDS; ++i){if (_pollfds[i].fd == INVALID_FD){_pollfds[i].fd = newfd;_pollfds[i].events = POLLIN;_pollfds[i].revents = 0;lg(Info, "Get A New Sockfd:%d", newfd);break;}if (i == MAX_POLLFDS){lg(Warning, "Fds Is Full, Newfd:%d Closed...", newfd);close(newfd);return;}}}void Handler(int fd, int i){char buffer[1024];memset(buffer, 0, sizeof buffer);int n = read(fd, buffer, sizeof buffer - 1);if (n > 0){buffer[n] = 0;std::string mes = buffer;std::cout << mes;_pollfds[i].revents = 0;}else if (n < 0){lg(Warning, "Read Error...");close(fd);_pollfds[i].fd = INVALID_FD;}else{lg(Info, "Foreign Host Closed...");close(fd);_pollfds[i].fd = INVALID_FD;}}void Dispatcher(){for (int i = 0; i < MAX_POLLFDS; ++i){if (_pollfds[i].fd == INVALID_FD){continue;}else if (_pollfds[i].revents & POLLIN){if (_pollfds[i].fd == _listensock._sockfd){// acceptAccepter();continue;}Handler(_pollfds[i].fd, i);}}}void Start(){while (1){Print();int n = poll(_pollfds, MAX_POLLFDS, 5000);if (n == 0){lg(Info, "Poll Time Out...");continue;}else if (n < 0){lg(Warning, "Poll Error...");std::cout << "errno:" << errno << " strerror:" << strerror(errno) << std::endl;}else{Dispatcher();}}}~PollServer(){_listensock.Close();}private:struct pollfd _pollfds[MAX_POLLFDS];Socket _listensock;uint16_t _port;
};

总结

poll相比较于select,弥补了两个缺点。

  1. 不再需要繁琐地更新需要关心的fd和其对应事件。
  2. 可关心的fd数量不再受其接口内置的数据结构大小限制,可以根据用户需求自由调整。

但是仍然还有缺点,那就是每次进行一次poll都是一次从用户态拷贝数据到内核态的过程。 还有还是需要一些for循环遍历那些已经就绪了的fd。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/39778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

60种AI工具用法 学会探索AI的无限可能

外面还在卖的课程&#xff0c;学会探索AI的无限可能&#xff0c;从构建精准的提示词到获取个性化新闻&#xff0c;从快速制作PPT到短视频内容的智能提炼&#xff0c;再到编程、股市分析和视频剪辑&#xff0c;AI工具助您工作学习效率飞跃提升&#xff01; 百度网盘 请输入提取…

2024 世界人工智能大会暨人工智能全球治理高级别会议全体会议在上海举办,推动智能向善造福全人类

2024 年 7 月 4 日&#xff0c;2024 世界人工智能大会暨人工智能全球治理高级别会议-全体会议在上海世博中心举办。联合国以及各国政府代表、专业国际组织代表&#xff0c;全球知名专家、企业家、投资家 1000 余人参加了本次会议&#xff0c;围绕“以共商促共享&#xff0c;以善…

【图像分割】mask2former:通用的图像分割模型详解

最近看到几个项目都用mask2former做图像分割&#xff0c;虽然是1年前的论文&#xff0c;但是其attention的设计还是很有借鉴意义&#xff0c;同时&#xff0c;mask2former参考了detr的query设计&#xff0c;实现了语义和实例分割任务的统一。 1.背景 1.1 detr简介 detr算是第…

基于github.com/emmansun/gmsm库编写的SM2对C 开放的库

go-gmsm cgo库 介绍 基于github.com/emmansun/gmsm库编写的SM2对C 开放的库 特性&#xff1a;非对称加密、不支持跨平台编译 git地址&#xff1a;https://gitee.com/state-secret-series/go-gmsm.git 软件架构 Go、Cgo、mod 安装教程 克隆仓库 git clone https://gite…

香橙派AIpro实测:YOLOv8便捷检测,算法速度与运行速度结合

香橙派AIpro实测&#xff1a;YOLOv8便捷检测&#xff0c;算法速度与运行速度结合 文章目录 香橙派AIpro实测&#xff1a;YOLOv8便捷检测&#xff0c;算法速度与运行速度结合一、引言二、香橙派AIpro简介三、YOLOv8检测效果3.1 目标检测算法介绍3.1.1 YOLO家族3.1.2 YOLOv8算法理…

NDT配准收敛问题

GitHub - abougouffa/ndtpso_slam: ROS package for NDT-PSO, a 2D Laser scan matching algorithm for SLAM SRG NDT Das_Arun_2013.pdf;jsessionid97F7EDB4E8805EFE68D1E46687EF593F (uwaterloo.ca)

上海计算机考研炸了,这所学校慎报!上海大学计算机考研考情分析!

上海大学&#xff08;Shanghai University&#xff09;&#xff0c;简称“上大”&#xff0c;是上海市属、国家“211工程”重点建设的综合性大学&#xff0c;教育部与上海市人民政府共建高校&#xff0c;国防科技工业局与上海市人民政府共建高校&#xff0c;国家“双一流”世界…

【微信小程序开发】微信小程序界面弹窗,数据存储相关操作代码逻辑实现

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

ArcGIS Pro SDK (七)编辑 12 编辑模版

ArcGIS Pro SDK &#xff08;七&#xff09;编辑 12 编辑模版 文章目录 ArcGIS Pro SDK &#xff08;七&#xff09;编辑 12 编辑模版1 在图层上按名称查找编辑模板2 查找属于独立表的表模板3 当前模板4 更改模板的默认编辑工具5 隐藏或显示模板上的编辑工具6 使用图层创建新模…

how to use Xcode

Xcode IDE概览 Xcode 页面主要分为以下四个部分&#xff1a; 工具栏&#xff08;ToolBar area&#xff09;&#xff1a;主要负责程序运行调试&#xff0c;编辑器功能区域的显示 / 隐藏&#xff1b;编辑区&#xff08;Editor area&#xff09;&#xff1a;代码编写区域&#xf…

140. 好二叉树(卡码网周赛第二十四期(23年腾讯音乐笔试真题))

140. 好二叉树&#xff08;卡码网周赛第二十四期&#xff08;23年腾讯音乐笔试真题&#xff09;&#xff09; 题目描述 小红定义一个二叉树为“好二叉树”&#xff0c;当且仅当该二叉树所有节点的孩子数量为偶数(0 或者 2)。 小红想知道&#xff0c;n&#xff08;1< n <…

vue table表格 ( parseTime-格式化时间)

<el-table-column label"发布时间" width"420px" prop"bidPublishDatetime"><template slot-scope"scope"><span>{{ parseTime(scope.row.bidPublishDatetime, {y}-{m}-{d}) }}</span></template></…

若依代码生成

在若依框架中&#xff0c;以下是这些代码的作用及它们在程序运行中的关联方式&#xff1a; 1. domain.java&#xff1a;通常用于定义实体类&#xff0c;它描述了与数据库表对应的对象结构&#xff0c;包含属性和对应的访问方法。作用是封装数据&#xff0c;为数据的操作提供基…

Richtek立锜科技车规级器件选型

芯片按照应用场景&#xff0c;通常可以分为消费级、工业级、车规级和军工级四个等级&#xff0c;其要求依次为军工>车规>工业>消费。 所谓“车规级元器件”--即通过AEC-Q认证 汽车不同于消费级产品&#xff0c;会运行在户外、高温、高寒、潮湿等苛刻的环境&#xff0c…

澳蓝荣耀时刻,6款产品入选2024年第一批《福州市名优产品目录》

近日&#xff0c;福州市工业和信息化局公布2024年第一批《福州市名优产品目录》&#xff0c;澳蓝自主研发生产的直接蒸发冷却空调、直接蒸发冷却组合式空调机组、间接蒸发冷水机组、高效间接蒸发冷却空调机、热泵式热回收型溶液调湿新风机组、防火湿帘6款产品成功入选。 以上新…

飞利浦的台灯值得入手吗?书客、松下多维度横评大分享!

随着生活品质的持续提升&#xff0c;人们对于健康的追求日益趋向精致与高端化。在这一潮流的推动下&#xff0c;护眼台灯以其卓越的护眼功效与便捷的操作体验&#xff0c;迅速在家电领域崭露头角&#xff0c;更成为了众多家庭书房中不可或缺的视力守护者。这些台灯以其精心设计…

(vue)eslint-plugin-vue版本问题 安装axios时npm ERR! code ERESOLVE

(vue)eslint-plugin-vue版本问题 安装axios时npm ERR! code ERESOLVE 解决方法&#xff1a;在命令后面加上 -legacy-peer-deps结果&#xff1a; 解决参考&#xff1a;https://blog.csdn.net/qq_43799531/article/details/131403987

【C语言】指针剖析(完结)

©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 回调函数概念回调函数的使用 - qsort函数 sizeof/strlen深度理解概念手脑并用1.sizeof-数组/指针专题2.strlen-数组/指针专题 指针面试题专题 回调函…

云服务器linux系统安装配置docker

在我们拿到一个纯净的linux系统时&#xff0c;我需要进行一些基础环境的配置 &#xff08;如果是云服务器可以用XShell远程连接&#xff0c;如果连接不上可能是服务器没开放22端口&#xff09; 下面是配置环境的步骤 sudo -s进入root权限&#xff1a;退出使用exit sudo -i进入…

process.env.VUE_APP_BASE_API

前端&#xff1a;process.env.VUE_APP_BASE_API 在Vue.js项目中&#xff0c;特别是使用Vue CLI进行配置的项目&#xff0c;process.env.VUE_APP_BASE_API 是一个环境变量的引用。Vue CLI允许开发者在不同环境下配置不同的环境变量&#xff0c;这对于管理API基础路径、切换开发…