io多路复用之poll的详细执行过程
1.结构体struct pollfd的定义
struct pollfd {
int fd; /* 文件描述符 */
short events; /* 想要监视的事件(input/output/priority) */
short revents; /* 实际发生的事件(返回的事件) */
};
2.定义pollfd数组,并设置listenfd想要监听的事件
struct pollfd fds[POLL_SIZE]={0};//定义一个POLL_SIZE大小的pollfd数组fds[sockfd].fd=sockfd;fds[sockfd].events=POLLIN;//设置想要监听的事件为POLLIN
3.调用函数poll()监听事件的发生,并返回实际发生的事件
int nready=poll(fds,maxfd+1,-1);
printf("nready:%d\n",nready);//实际发生的事件的数量
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
fds
:一个指向struct pollfd
结构体数组的指针,每个结构体描述了一个要监视的文件描述符及其关联的事件和发生的事件
nfds
:表示文件描述符数组fds
的大小,即要监视的文件描述符的数量。
timeout
:超时值,指定poll()
函数的阻塞时间。它可以有以下几种取值:
- 传递负数:表示无限阻塞,
poll()
函数将一直等待,直到至少一个文件描述符的事件发生。- 传递0:表示非阻塞模式,
poll()
函数会立即返回,不管文件描述符的状态如何。- 传递正整数:表示超时时间(以毫秒为单位),
poll()
函数会等待指定的毫秒数后返回,如果在超时前没有任何事件发生,它将返回0
注意:poll的返回值并不是clientfd(客户端)连接注册想要监听的事件,而是在这些已注册监听事件中实际发生的事件的个数.
4.判断revent数值
在调用
poll
函数后,revents
字段会被设置为实际发生的事件。revents
字段是一个位掩码,它可以包含以下几个值中的一个或多个,表示文件描述符的状态:
POLLIN
:文件描述符可以进行读取操作。POLLOUT
:文件描述符可以进行写入操作。POLLERR
:文件描述符发生了错误。POLLHUP
:文件描述符挂起(连接关闭)。POLLNVAL
:文件描述符无效。
如果要检查文件描述符是否可以读取,可以执行以下操作:
if (revents & POLLIN) {// 文件描述符可以进行读取操作
}
只有当被监听的事件实际发生时才会执行
demo:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<fcntl.h>
#include<poll.h>#define PORT 8848#define POLL_SIZE 1024
#define BUFLEN 128int main(){int sockfd=socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in serveraddr;memset(&serveraddr,0,sizeof(struct sockaddr_in));serveraddr.sin_family=AF_INET;serveraddr.sin_port=htons(PORT);serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);if(-1==bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))){printf("bind failed\n");exit(1);}listen(sockfd,10);//poll/*struct pollfd {int fd; //文件描述符 short events; // 想要监视的事件(input/output/priority) short revents; // 实际发生的事件(返回的事件) };*/struct pollfd fds[POLL_SIZE]={0};fds[sockfd].fd=sockfd;fds[sockfd].events=POLLIN;int maxfd=sockfd;int clientfd=0;int count=0;while(1){printf("count:%d\n",count++);//打印while循环次数//sleep(10);//休眠10sint nready=poll(fds,maxfd+1,-1);printf("nready:%d\n",nready);//实际发生的事件的数量//reventif(fds[sockfd].revents&POLLIN){struct sockaddr_in clientaddr;socklen_t len=sizeof(clientaddr);clientfd=accept(sockfd,(struct sockaddr*)&clientaddr,&len);printf("new client:%d\n",clientfd);fds[clientfd].fd=clientfd;fds[clientfd].events=POLLIN;if(clientfd>maxfd){maxfd=clientfd;}if(nready-1==0){continue;}}int i=sockfd+1;for(;i<=maxfd;i++){char buffer[BUFLEN]={0};int ret=0;if(fds[i].revents&POLLIN){//只有事件实际发生时,该if程序才会被执行ret=read(fds[i].fd,buffer,BUFLEN-1);if(ret==0){//客户端主动关闭printf("client %d close\n",fds[i].fd);close(fds[i].fd);//关闭socket//重置fds[i].fd=-1;fds[i].events=0;continue;}buffer[ret]='\0';printf("recv from client:%d buffer:%s\n",fds[i].fd,buffer);ret=write(fds[i].fd,buffer,strlen(buffer));}}}exit(0);
}
相关文章:
io多路复用之poll的详细执行过程
1.结构体struct pollfd的定义 struct pollfd { int fd; /* 文件描述符 */ short events; /* 想要监视的事件(input/output/priority) */ short revents; /* 实际发生的事件(返回的事件) */ }; 2.定义po…...
网络安全深入学习第四课——热门框架漏洞(RCE— Log4j2远程代码执行)
文章目录 一、log4j2二、背景三、影响版本四、漏洞原理五、LDAP和JNDI是什么六、漏洞手工复现1、利用DNSlog来测试漏洞是否存在2、加载恶意文件Exploit.java,将其编译成class文件3、开启web服务4、在恶意文件Exploit.class所在的目录开启LDAP服务5、监听反弹shell的…...
大数据Flink(八十一):SQL 时区问题
文章目录 SQL 时区问题 一、SQL 时区解决的问题...
Input子系统 - Kernel驱动程序 - Android
Input子系统 - Kernel驱动程序 - Android 1、Input子系统相关定义1.1 代码位置1.2 input_dev结构体:表示输入设备1.3 input_handler结构体:struct input_handler - implements one of interfaces for input devices1.4 input_handle结构体:将…...
MySQL里的查看操作
文章目录 查看当前mysql有谁连接查看数据库或者表 查看当前mysql有谁连接 show processlist;查看数据库或者表 列出所有数据库: show databases;查看正在使用的数据库(必须大写): SELECT DATABASE();列出数据库中的表…...
Vim的基础操作
前言 本文将向您介绍关于vim的基础操作 基础操作 在讲配置之前,我们可以新建一个文件 .vimrc,并用vim打开在里面输入set nu 先给界面加上行数,然后shift ;输入wq退出 默认打开:命令模式 在命令模式中:…...
十天学完基础数据结构-第一天(绪论)
1. 数据结构的研究内容 数据结构的研究主要包括以下核心内容和目标: 存储和组织数据:数据结构研究如何高效地存储和组织数据,以便于访问和操作。这包括了在内存或磁盘上的数据存储方式,如何将数据元素组织成有序或无序的集合&…...
神经网络 03(参数初始化)
一、参数初始化 对于某一个神经元来说,需要初始化的参数有两类:一类是权重W,还有一类是偏置b,偏置b初始化为0即可。而权重W的初始化比较重要,我们着重来介绍常见的初始化方式。 (1)随机初始化 …...
div设置圆角#前端
要在 div元素上设置圆角,您可以使用 CSS 的 border-radius 属性。 这个属性允许您指定元素的边角为圆角,可以将其应用于一个或多个边角。以下是一些示例代码:1.设置所有四个边角为圆角: div {border-radius: 10px; /* 设置所有四…...
Windows开机密码破解
Windows11以及Windows10(21H2)以上版本 先开机,不进行任何操作,静静的等待登录界面 按住Shift重启 进入“选择一个选项”界面,点击疑难解答 点击高级选项 点击命令提示符 输入两行命令 copy C:\windows\system32\uti1man.exe C: \Window…...
Mobirise for Mac:轻松创建手机网站的手机网站建设软件
如果你是一位设计师或者开发人员,正在寻找一款强大的手机网站建设软件,那么Mobirise for Mac绝对值得你尝试。这个独特的应用程序将帮助你轻松创建优雅而实用的手机网站,而无需编写复杂的代码。 Mobirise for Mac的主要特点包括:…...
[npm] npx 介绍与使用说明
[npm] npx 介绍与使用说明 npm 的由来npx 是什么?npx 特点npx 的特点项目安装包的使用全局安装包的避免指定工具包版本--no-install 参数和--ignore-existing 参数使用不同版本的 node-p 参数-c 参数实战应用 执行 GitHub 源码 npm 的由来 说到 npm 就离不开社区文…...
QT : 仿照QQ 完成弹出登录窗口,并实例化组件
1. 运行效果图 2. Headers #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow(); }; #endif // MAINWINDOW_H 3. mainWindow.cpp :…...
typescrip接口 interface详解,以及ts实现多态
ts 接口 当一个对象类型被多次使用时,一般会使用接口(interface)来描述对象的类型,达到复用的目的 示例如下 当一个对象类型被多次使用时,可以看到,很明显代码有大量的冗余 let personTom: { name: string, age?: number, sayHi(name: string): void } {name: Tom,sayHi(n…...
Vivado IP中Generate Output Products的设置说明
文章目录 Vivado IP中Generate Output Products的设置说明Synthesis OptionsRun Settings 官方文档中的介绍Generate Output ProductsSynthesis Options for IP 参考文献 Vivado IP中Generate Output Products的设置说明 在创建IP核时,将IP核的信息配置完成之后会弹…...
9.3.5网络原理(应用层HTTP/HTTPS)
一.HTTP: 1. HTTP是超文本传输协议,除了传输字符串,还可以传输图片,字体,视频,音频. 2. 3.HTTP协议报文格式:a.首行,b.请求头(header),c.空行(相当于一个分隔符,分隔了header和body),d.正文(body). 4. 5.URL:唯一资源描述符(长度不限制). a. b.注意:查询字符串(query stri…...
vue基础知识十一:Vue组件之间的通信方式都有哪些?
一、组件间通信的概念 开始之前,我们把组件间通信这个词进行拆分 组件通信 都知道组件是vue最强大的功能之一,vue中每一个.vue我们都可以视之为一个组件通信指的是发送者通过某种媒体以某种格式来传递信息到收信者以达到某个目的。广义上,…...
高阶数据结构(2)-----红黑树(未完成)
一)红黑树的基本概念和基本性质: 1)红黑树就是一种高度平衡的二叉搜索树,但是在每一个节点上面都增加了一个存储位来表示结点的颜色,可以是红色或者是黑色,通过对任何一条从根节点到叶子节点上面的路径各个节点着色方式的限制,红黑…...
[mockjs]Mock使用过程中的坑
[mockjs]Mock使用过程中的坑 现象描述原因分析解决方案修改源码处理无法识别的文件流 现象描述 mockjs在使用的过程中出现了下载文件无法正常打开的问题,但是在线上环境是正常的 console.log打印返回的response,发现是本地无法正常解析response.data 在代码中&am…...
华为云云耀云服务器L实例评测|部署前后端分离项目
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 学习测评 ✨特色专栏: MyS…...
02目标检测-传统检测方法
目录 一、目标学习的检测方法变迁及对比 二、 基于传统手工特征的检测算法的定义 三、传统主要手工特征与算法 Haar特征与 人脸检测算法 - Viola-Jones(了解) HOG特征与 SVM 算法(了解)(行人检测、opencv实现) SIFT特征与SIFT算法(了解) DPM&#…...
RP-母版 流程图 发布和预览 团队项目
母版 创建一个模版,可根据形态不同引用不同母版。若不想母版受页面变化影响,也可以在引用时脱离母版 创建母版: 1) 转换为母版 2)在母版页面中添加 母版拖放行为 拖放行为,在母版名称上右键, 、 任意…...
【第200篇原创文章】解决低于1%概率出现的芯片VPSS模块跑飞的问题
在发布SDK内测的时候,我们发现在切换视频分辨率的时候有低概率出现VPSS模块跑飞的情况,概率低于1%,试个两三百次,能出1~2次。切换视频分辨率这个功能在安防产品上也确实存在需求,网络带宽不大好的地方分辨率可以适当下…...
微信小程序——生命周期详解(代码解读)
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
多分类中混淆矩阵的TP,TN,FN,FP计算
关于混淆矩阵,各位可以在这里了解:混淆矩阵细致理解_夏天是冰红茶的博客-CSDN博客 上一篇中我们了解了混淆矩阵,并且进行了类定义,那么在这一节中我们将要对其进行扩展,在多分类中,如何去计算TP࿰…...
Linux系统:OpenSSH7.4p升级到9.0p(服务器漏洞)
清华大学开源软件镜像站下载地址: https://mirrors.tuna.tsinghua.edu.cn/pub/OpenBSD/OpenSSH/portable/openssh-9.0p1.tar.gz 一、升级 0、安装Telnet (1)为防止安装失败,无法用ssh做远程连接,因此先安装telnet yum…...
【面试刷题】——C++的特点简单说明
C是一种通用的编程语言,具有许多强大的特点,以下是其中一些主要特点的简单说明: 面向对象编程(OOP): C支持面向对象编程,允许将数据和操作封装在类中,提高了代码的可维护性和重用性…...
C2基础设施威胁情报对抗策略
威胁情报是指在信息安全和安全防御领域,收集、分析和解释与潜在威胁相关的信息,以便预先发现并评估可能对组织资产造成损害的潜在威胁,是一种多维度、综合性的方法,其通过信息的收集、分析和研判,帮助组织了解可能对其…...
差异备份详细说明(InsCode AI 创作助手)
差异备份详细说明 差异备份(Differential Backup)是一种备份策略,它与增量备份类似,但有一些关键区别。差异备份备份的是自上一次完整备份以来的所有更改数据,而不是自上一次备份以来的所有更改。这意味着差异备份文件…...
flask要点与坑
简介 Flask是一个用Python编写的Web应用程序框架,该框架简单易用、模块化、灵活性高。 该笔记主要记录Flask的关键要点和容易踩坑的地方 Flask 日志配置 Flask 中的自带logger模块(也是python自带的模块),通过简单配置可以实现…...
如何在百度举报网站/网络营销运营公司
1.java3d开发环境搭建 jdk(java development kit)安装java3d安装IDE安装(eclipse,idea,netbeans选择一种即可) 2.java3d开发引擎 JMEArdor3DXith3D 3.java3d原理 JAVA 3D从高层次为开发者提供对三维实体的创建、操纵和着色,使开发工作变得极为简单。同时&#…...
一个做二维码问卷调查的网站/百度竞价排名怎么做
本文主要解决openssl升级到1.1.0以上版本,导致shadows2.8.2启动报undefined symbol: EVP_CIPHER_CTX_cleanup错误。 如果在安装完Shadows后,启动时报 AttributeError: /usr/local/ssl/lib/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cleanup…...
小说网站开发业务逻辑/seo黑帽有哪些技术
计算属性 1.作用 1.当需要处理一些复杂的业务逻辑时,需要用到计算属性. 2.一行表达式无法完成的计算时,需要使用计算属性2.使用 * 1.计算属性中定义的属性名可以直接显示在视图中 * 2.计算属性值必须要有return 3.计算属性中属性名不能和data中的属性名重叠 书写规范: comput…...
镇江网站seo外包/su搜索引擎优化
GeccoSpider爬虫例子 前些天,想要用爬虫抓取点东西,但是网上很多爬虫都是使用python语言的,本人只会java,因此,只能找相关java的爬虫资料,在开源中国的看到国内的大神写的一个开源的爬虫框架,并…...
厦门网站建设外包维护/百度云资源共享
2019独角兽企业重金招聘Python工程师标准>>> 准备工作3个虚拟机节点的构成如下 :安装步骤操作过程1、安装包已经上传至其中1个节点。 2、解压缩安装包 命令:unzip rocketmq-all-4.0.0-incubating-bin-release.zip 解压缩之后如下:…...
响应式mvc企业网站源码/上海网站营销seo电话
计算机的本质就是计算,在其内部是0和1的比特位的变化,对外表现就是数据的变化。那么,计算机都能处理什么数据呢?本质上,数据都是以字节(Byte)存储的,表现上看,它们就是整数、浮点数和字符串等。…...