day-07 I/O复用(select)

一.I/O复用

(一)基于I/O复用的服务器端

1.多进程服务器

        每次服务都需要创建一个进程,需要大量的运算和内存空间

2.复用

        只需创建一个进程。

3.复用技术在服务器端的应用

 (二)select函数实现服务器端

  • (Linux和Windows平台下均有select函数,所以具有良好移植性)

1.select函数调用过程:

2.select函数示例:(5秒内控制才没有输入,就输出 Timeout ;否则打印输入。)

#include<iostream>
#include<unistd.h>
#include<sys/time.h>
#include<sys/select.h>
using namespace std;
#define BUF_SIZE 30int main(int argc,char *argv[]){fd_set reads,temps;int result,str_len;//fd_set类型是一个文件描述符集合,char buf[BUF_SIZE];//在这里声明了reads和temps两个集合用于I/O复用。struct timeval timeout;FD_ZERO(&reads);//用于清空文件描述符集合。FD_SET(0,&reads);//将标准输入文件描述符添加到集合中while(1){temps=reads;//在每次循环开始时,将temps设置为上一次存有文件描述符的集合reads的副本。timeout.tv_sec=5;//设置超时时间为5秒timeout.tv_usec=0;result=select(1,&temps,0,0,&timeout);调用select函数来等待可读事件就绪或超时发生。if(result==-1){//第一个参数表示要监视的最大文件描述符值加1,cout<<"select() error"<<endl;//第二个参数是指向待检查的文件描述符集合的指针,break;                       //后面的三个参数是输出参数。}else if(result==0)cout<<"Time out"<<endl;else{if(FD_ISSET(0,&temps))//检查输入文件描述符是否就绪{str_len=read(0,buf,BUF_SIZE);buf[str_len]=0;cout<<"message from console: "<<buf<<endl;}}//如果select函数返回-1,表示出现了错误,输出错误信息并跳出循环。//如果select函数返回0,表示超时,输出"Time out"。//如果select函数返回大于0的值,表示文件描述符就绪。//这里通过FD_ISSET宏检查标准输入文件描述符是否在集合中就绪。//如果标准输入文件描述符就绪,调用read函数读取输入内容,并输出到控制台。}return 0;
}

3.实现I/O复用服务器端

#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<sys/time.h>
#include<sys/select.h>
using namespace std;#define BUF_SIZE 100//宏定义了一个缓冲区大小为100的常量。
void error_handling(const  char *buf);int main(int argc,char *argv[]){int serv_sock,clnt_sock;struct sockaddr_in serv_adr,clnt_adr;struct timeval timeout;fd_set reads,cpy_reads;socklen_t adr_sz;int fd_max,str_len,fd_num,i;char buf[BUF_SIZE];if(argc!=2){cout<<"Usage:"<<argv[0]<<endl;exit(1);}serv_sock=socket(PF_INET,SOCK_STREAM,0);//创建套接字memset(&serv_adr,0,sizeof(serv_adr));//将结构体清零serv_adr.sin_family=AF_INET;serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);//设置服务器地址信息、IP地址和端口号serv_adr.sin_port=htons(atoi(argv[1]));if(bind(serv_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr))==-1)error_handling("bind() error");      //将套接字和指定地址绑定if(listen(serv_sock,5)==-1)//开始监听连接请求error_handling("listen() error");FD_ZERO(&reads);//清空文件描述符集合FD_SET(serv_sock,&reads);//将服务器套接字添加到reads集合中fd_max=serv_sock;//fd_max初始化为服务器套接字的值while(1){//进入主循环cpy_reads=reads;//将reads集合复制过来timeout.tv_sec=5;//超时时间timeout.tv_usec=5000;if((fd_num=select(fd_max+1,&cpy_reads,0,0,&timeout))==-1)break;        //监控文件描述符的状态变化if(fd_num==0)continue;for(i=0;i<fd_max+1;i++){if(FD_ISSET(i,&cpy_reads)){//检查文件描述符是否就绪if(i==serv_sock){//如果是服务器套接字,表示有新的客户端连接请求adr_sz=sizeof(clnt_adr);clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_adr,&adr_sz);FD_SET(clnt_sock,&reads);if(fd_max<clnt_sock)fd_max=clnt_sock;cout<<"connect client: "<<clnt_sock<<endl;}else{//如果不是服务器套接字,表示已连接的客户端有数据发送过来str_len=read(i,buf,BUF_SIZE);if(str_len==0){FD_CLR(i,&reads);close(i);cout<<"closed client:"<<i<<endl;}elsewrite(i,buf,str_len);}}}}close(serv_sock);return 0;
}void error_handling(const char *buf){cout<<buf<<endl;exit(1);
}

(三)总结 

1.请解释复用技术的通用含义,并说明何为I/O复用。

复用技术指为了提高物理设备的效率,用最少的物理要素传递最多数据时使用的技术。同样,I/O复用是指将需要I/O的套接字捆绑在一起,利用最少限度的资源来收发数据的技术

2.多进程并发服务器的缺点有哪些?如何在I/O复用服务器端中弥补?

多进程并发服务器的服务方式是,每当客户端提出连接要求时,就会追加生成进程。但构建进程是一项非常有负担的工作,因此,向众多客户端提供服务存在一定的局限性。而复用服务器则是将套接字的文件描述符捆绑在一起管理的方式,因此可以一个进程管理所有的I/O操作

3.select函数的观察对象中应包含服务器端套接字(监听套接字),那么应将其包含到哪一类监听对象集合?请说明原因

服务器套接字的作用是监听有无连接请求,即判断接收的连接请求是否存在?应该将其包含到“读”类监听对象的集合中。

4.select函数使用的fd_set结构体在Windows和Linux中具有不同的声明。请说明却别,同时解释存在区别的必然性

Linux的文件描述符从0开始递增,因此可以找出当前文件描述符数量和最后生成的文件描述符之间的关系。但Windows的套接字句柄并非从0开始,并且句柄的整数值之间并无规律可循,因此需要直接保存句柄的数组和记录句柄数的变量。

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

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

相关文章

Linux安装Nginx

文章目录 一、前言二、Nginx相关概念1、Nginx简介2、Nginx工作原理3、Nginx主要功能 三、安装Nginx1、安装依赖包2、准备nginx安装包3、解压4、安装前的准备&#xff08;重要&#xff09;5、安装6、启动 一、前言 本文将详细介绍在Linux系统下如何安装nginx 二、Nginx相关概念…

深度学习推荐系统(五)DeepCrossing模型及其在Criteo数据集上的应用

深度学习推荐系统(五)Deep&Crossing模型及其在Criteo数据集上的应用 在2016年&#xff0c; 随着微软的Deep Crossing&#xff0c; 谷歌的Wide&Deep以及FNN、PNN等一大批优秀的深度学习模型被提出&#xff0c; 推荐系统全面进入了深度学习时代&#xff0c; 时至今日&am…

AAC之处理码流分析工具(三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

Qt各个版本下载及安装教程(离线和非离线安装)

Qt各个版本下载链接&#xff1a; Index of /archive/qthttps://download.qt.io/archive/qt/ 离线安装 &#xff0c;离线安装很无脑&#xff0c;下一步下一步就可以。 我离线下载 半个小时把2G的exe下载下来了

RNN 单元:分析 GRU 方程与 LSTM,以及何时选择 RNN 而不是变压器

一、说明 深度学习往往感觉像是在雪山上找到自己的道路。拥有坚实的原则会让你对做出决定更有信心。我们都去过那里 在上一篇文章中&#xff0c;我们彻底介绍并检查了 LSTM 单元的各个方面。有人可能会争辩说&#xff0c;RNN方法已经过时了&#xff0c;研究它们是没有意义的。的…

CSS实现白天/夜晚模式切换

目录 功能介绍 示例 原理 代码 优化 总结 功能介绍 在网页设计和用户体验中&#xff0c;模式切换功能是一种常见的需求。模式切换可以为用户提供不同的界面外观和布局方案&#xff0c;以适应其个人偏好或特定环境。在这篇博客中&#xff0c;我们将探索如何使用纯CSS实现一…

Debezium的三种部署方式

Debezium如何部署 debezium 有下面三种部署方式,其中最常用的就是 kafka connect。 kafka connect 一般情况下,我们通过 kafka connect 来部署 debezium,kafka connect 是一个框架和运行时: source connectors:像 debezium 这样将记录发送到 kafka 的source connectors…

Linux音频了解

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01; 本章将会讨论如下主题内容。 ⚫ Linux 下 ALSA 框架概述&#xff1b; ⚫ alsa-lib 库介绍&#xff1b; ⚫ alsa-lib 库移植&#xff1b; ⚫ alsa-l…

卡特兰数和算法

在组合数学中&#xff0c;卡特兰数是一系列自然数&#xff0c;出现在各种组合计数问题中&#xff0c;通常涉及递归定义的对象。它们以比利时数学家尤金查尔斯卡特兰&#xff08;Eugne Charles Catalan&#xff09;的名字命名。 卡特兰数序列是1, 1, 2, 5, 14, 42......&#xf…

合宙Air724UG LuatOS-Air LVGL API控件--复选框 (Checkbox)

复选框 (Checkbox) 复选框主要是让用户进行一些内容选择&#xff0c;或者同意用户协议。 示例代码 – 复选框回调函数 function event_handler(obj, event) if event lvgl.EVENT_VALUE_CHANGED then print(“State”, lvgl.checkbox_is_checked(obj)) end end – 创建复选框…

STM32 FREERTOS osDelayUntil()异常

问题&#xff1a; 在使用osDelayUntil&#xff08;&#xff09;进行固定延时时发现不起作用&#xff0c;程序不能按照预期的延时进行执行&#xff08;比延时要快&#xff09;。 #define taskMBSysManage_Delay_TIME 1000 TickType_t xLastWakeTime; xLastWakeTime xTaskGe…

githubPage部署Vue项目

github中新建项目 my-web &#xff08;编写vue项目代码&#xff09; myWebOnline(存放Vue打包后的dist包里面的文件) 发布流程 &#xff08;假设my-web项目已经编写完成&#xff09;Vue-cli my-web vue.config.js文件中 const { defineConfig } require(vue/cli-service)…

OpenCV(八):图像二值化

目录 1.固定值二值化 2.自适应阈值二值化 3.Android JNI完整代码 1.固定值二值化 固定阈值二值化是OpenCV中一种简单而常用的图像处理技术&#xff0c;用于将图像转换为二值图像。在固定阈值二值化中&#xff0c;像素值根据一个预定义的阈值进行分类&#xff0c;大于阈值的…

对比Flink、Storm、Spark Streaming 的反压机制

分析&回答 Flink 反压机制 Flink 如何处理反压? Storm 反压机制 Storm反压机制 Storm 在每一个 Bolt 都会有一个监测反压的线程&#xff08;Backpressure Thread&#xff09;&#xff0c;这个线程一但检测到 Bolt 里的接收队列&#xff08;recv queue&#xff09;出现了…

Java异常(Error与Exception)与常见异常处理——第八讲

前言 前面我们讲解了Java的基础语法以及面向对象的思想,相信大家已经基本掌握了Java的基本编程。在之前代码中,我们也看到代码写错了编译器会提示报错,或者编译器没有提示,但是运行的时候报错了,比如前面的数组查询下标超过数组的长度。所以在使用计算机语言进行项目开发的…

简单了解ICMP协议

目录 一、什么是ICMP协议&#xff1f; 二、ICMP如何工作&#xff1f; 三、ICMP报文格式 四、ICMP的作用 五、ICMP的典型应用 5.1 Ping程序 5.2 Tracert(Traceroute)路径追踪程序 一、什么是ICMP协议&#xff1f; ICMP因特网控制报文协议是一个差错报告机制&#xff0c;…

实力认证!OceanBase获“鼎信杯”优秀技术支撑奖

6 月 30 日&#xff0c;2023 “鼎信杯”信息技术发展论坛在京隆重举办第二届“鼎信杯”大赛颁奖典礼。OceanBase 凭借完全自主研发的原生分布式数据库&#xff0c;以及丰富的核心系统国产数据库升级案例&#xff0c;斩获“优秀技术支撑奖”。 论坛上&#xff0c;国内首个基于在…

ThreeJS 模型中内嵌文字

之前有过模型中内嵌html网页&#xff0c;地址☞threeJS 模型中加载html页面_threejs 加载dom元素_小菜花29的博客-CSDN博客 这次是纯粹的在模型中嵌入文本信息&#xff0c;进行简单的文字展示 展示效果图 1. 使用FontLoader文字加载器 引入文本json文件&#xff0c;代码如下…

数据结构(Java实现)-排序

排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff…

2022年下半年系统架构设计师真题(下午带答案)

试题一 (25分) 某电子商务公司拟升级其会员与促销管理系统&#xff0c;向用户提供个性化服务&#xff0c;提高用户的粘性。在项目立项之初&#xff0c;公司领导层一致认为本次升级的主要目标是提升会员管理方式的灵活性&#xff0c;由于当前用户规模不大&#xff0c;业务也相对…