高级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算是第…

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

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

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

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

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

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

how to use Xcode

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

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></…

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-数组/指针专题 指针面试题专题 回调函…

谷粒商城-个人笔记(集群部署篇二)

前言 ​学习视频&#xff1a;​Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强​学习文档&#xff1a; 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…

【数据结构】02.顺序表

一、顺序表的概念与结构 1.1线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0…

GEE计算遥感生态指数RSEI

目录 RESI湿度绿度热度干度源代码归一化函数代码解释整体的代码功能解释:导出RSEI计算结果参考文献RESI RSEI = f (Greenness,Wetness,Heat,Dryness)其遥感定义为: RSEI = f (VI,Wet,LST,SI)式中:Greenness 为绿度;Wetness 为湿度;Thermal为热度;Dryness 为干度;VI 为植被指数…

【多媒体】Java实现MP4和MP3音视频播放器【JavaFX】【音视频播放】

在Java中播放音视频可以使用多种方案&#xff0c;最常见的是通过Swing组件JFrame和JLabel来嵌入JMF(Java Media Framework)或Xuggler。不过&#xff0c;JMF已经不再被推荐使用&#xff0c;而Xuggler是基于DirectX的&#xff0c;不适用于跨平台。而且上述方案都需要使用第三方库…

拒绝信息差!一篇文章说清Stable Diffusion 3到底值不值得冲

前言 就在几天前&#xff0c;Stability AI正式开源了Stable Diffusion 3 Medium&#xff08;以下简称SD3M&#xff09;模型和适配CLIP文件。这家身处风雨飘摇中的公司&#xff0c;在最近的一年里一直处于破产边缘&#xff0c;就连创始人兼CEO也顶不住压力提桶跑路。 即便这样&…

[leetcode]minimum-absolute-difference-in-bst 二叉搜索树的最小绝对差

. - 力扣&#xff08;LeetCode&#xff09; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(null…

LeetCode 196, 73, 105

目录 196. 删除重复的电子邮箱题目链接表要求知识点思路代码 73. 矩阵置零题目链接标签简单版思路代码 优化版思路代码 105. 从前序与中序遍历序列构造二叉树题目链接标签思路代码 196. 删除重复的电子邮箱 题目链接 196. 删除重复的电子邮箱 表 表Person的字段为id和email…