《TCP/IP网络编程》(第十二章)I/O复用(1)

本章将讨论实现并发服务器的第二种办法,基于I/O复用的服务器端构建

I/O复用它允许单个进程或线程同时处理多个输入/输出(I/O)操作,而无需为每个I/O操作创建一个独立的线程或进程。这种技术可以显著提高应用程序的效率和性能,特别是在需要处理大量并发连接的场景下。

1.多进程服务器端的缺点

基于进程的并发服务器在创建进程时,需要付出极大的代价,因为需要大量的运算和内存空间,而且由于每个进程具有独立的内存空间,相互间交换数据的方法也很复杂。
如果使用I/O复用技术,则可以在不创建进程的情况下同时向多个客户端进行服务。

2.基于I/O复用的服务器端

在这里插入图片描述
上图左边时多进程服务器端模型,右边是I/O复用服务器端模型,可以看出后者无论连接多少个客户端,提供服务的进程只有1个

3.理解select()函数

select() 函数是一种用于I/O复用的系统调用,它允许程序同时监视多个文件描述符(包括套接字),以确定哪些文件描述符已经准备好进行读取或写入操作。select() 函数在Linux系统和Windows系统中都支持,下面是以Linux系统为例,Windows系统示例放在最后。

select()函数基本语法

//发生错误时返回-1; 
//发生关注的事件返回时,返回该事件的文件描述符(大于0)
int select(
int maxds, //设置位监视的文件描述符中最大的描述符加1。例如,如果你监视的文件描述符范围是0到5,则maxfds应该设置为6。
fd_set *readfds, //将所有关注“是否有可读数据”的文件描述符注册到fd_set,并传递其地址值
fd_set *writefds,//将所有关注“是否有可写数据”的文件描述符注册到fd_set,并传递其地址值
fd_set *exceptfds, //将所有关注“是否发生异常”的文件描述符注册到fd_set,并传递其地址值
struct timeval *timeout//设置select() 调用的超时时间,为了防止调用select()函数后,陷入无限阻塞
);//struct timeval的结构体定义
struct timeval{
long tv_sec;    //秒数
long tv_usec;   //毫秒数
}

select()函数的调用过程

select()函数的调用流程如下图所示,本文将逐步介绍

在这里插入图片描述

  1. 设置文件描述符: select()可以监视多个文件描述符,将需要监视的文件描述符集中为一个集合fd_set,集中时也要按照读、写、异常进行分为三类,fd_set结构如下图所示:
    在这里插入图片描述
    设置为1则代表时监视对象,所以上图中fd1和fd3的是监视对象。在fd_set变量中用下列宏进行操作:
FD_ZERO(fd_set* fdset);          //将所有fd_set变量的所有位设置位0
FD_SET(int fd, fd_set* fdset);   //将fd_set中指定变量的位设置为1
FD_CLR(int fd, fd_set* fdset);   //将fd_set中指定变量的位设置为0
FD_ISSET(int fd, fd_set* fdset); //如果文件描述符在集合中,返回非零值;如果不在集合中,返回0。

在这里插入图片描述

  1. 指定监视范围:select() 函数中的第一个参数maxds, 要监视的文件描述符中最大的描述符加1。例如,如果你监视的文件描述符范围是0到5,则maxfds应该设置为6,因为文件描述分值是从0开始

  2. 设置超时: 如果监视的文件描述符一直没有变化,则会陷入阻塞状态,所以需要设置超时时间,告知服务器超时消息。将秒数填入tv_sec,将毫秒数填入tv_usec

  3. 调用select()函数: 调用 select() 函数,函数会阻塞,直到有文件描述符发生变化或者超时。

  4. 查看调用结果: 返回-1则发生错误;返回一个整数值,则代表有多少个文件描述符准备好了I/O操作,可以进行读取操作了,下图是变化
    在这里插入图片描述
    调用函数前,告诉select()函数,需要监视fd1、fd2、fd3,当调用函数后,首先是将监视的文件描述符的位初始化为0,然后监视到fd1和fd3发生变化,所以fd1和fd3的位又变成了1。

③select()函数示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/select.h>int main(){fd_set reads,temps;// 定义文件描述符集合,reads用于存储关注是否可读的文件描述符,temps用于存储select函数返回时准备好的文件描述符int result,str_len;// result用于存储select函数的返回值,str_len用于存储读取的字节数char buff[1024];struct timeval timeout;// 定义一个timeval结构,用于设置select函数的超时时间FD_ZERO(&reads);// 清空reads集合FD_SET(0,&reads);// 将文件描述符为0的设置为监视状态,文件描述符0通常代表标准输入(stdin),它是一个特殊的文件描述符,用于从键盘接收输入。while (1){temps=reads;/// 复制reads集合到temps集合timeout.tv_sec=5;timeout.tv_usec=0;result=select(1,&temps,0,0,&timeout);//1表示有1个文件被监视,temps表示被监视“是否可读”的文件描述符集合,0表示“不关注可写”文件描述符,0表示“不关注异常”文件描述符,timeout表示超时时间if(result==-1){// 如果select函数返回-1,表示出错puts("select error");break;}else if(result==0){// 如果select函数返回0,表示超时puts("time-out");}else{// 如果select函数返回大于0,表示有文件描述符准备好了if(FD_ISSET(0,&temps)){// 检查文件描述符0是否在temps集合中str_len=read(0,buff,1024);// 从文件描述符0读取数据到buff缓冲区,最多1024字节buff[str_len]=0;printf("message from console: %s",buff);}}}return 0;}

在这里插入图片描述

键盘输入有被正常监视到,如果不输入,5秒后会输出超时信息

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

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

相关文章

吊顶的做法防踩坑,吊顶怎么省钱还好看

怎么做个好看的吊顶?你天天抬头看不? 现在楼房到手本身层高两米75左右,等铺完地暖和瓷砖还得增加几公分 如果再整个吊顶,就属于花钱买压抑了,吊顶就是遮丑, 某些比较显层高还亮堂,今天把做法分享出来 开发商给的毛坯两米8 做完地暖铺完瓷砖,层高是两米七八, 让木工在走廊两边…

前端学习--React部分

文章目录 前端学习--React部分前言1.React简介1.1React的特点1.2引入文件1.3JSX&#x1f349;JSX简介与使用&#x1f349;JSX语法规则 1.4模块与组件&#x1f349;模块&#x1f349;组件 1.5安装开发者工具 2.React面向组件编程2.1创建组件&#x1f349;函数式组件&#x1f349…

Elasticsearch 认证模拟题 - 1

1、题目 定义一个数据流&#xff0c;满足 data-stream_*_*&#xff0c;数据首先分布在 data_hot&#xff0c;5分钟后移动到 data_warm&#xff0c;3分钟后到 data_cold&#xff0c;再过 8 分钟删除。 1.1 考点 生命周期索引模板数据流 1.2 答案 # 修改生命周期策略修改时间…

【算法】位运算算法——只出现一次的数字Ⅱ

题解&#xff1a;只出现一次的数字Ⅱ(位运算算法) 目录 1.题目2.题解&#xff1a;3.代码示例4.总结 1.题目 题目链接&#xff1a;LINK 要求&#xff1a;时间复杂度&#xff1a;O(N)&#xff0c;空间复杂度&#xff1a;O(1) 2.题解&#xff1a; 3.代码示例 class Solution {…

Java设计模式 _行为型模式_中介者模式

一、中介者模式 1、中介者模式 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型模式。主要通过一个中介类&#xff0c;该类通常处理不同类之间的通信&#xff0c;并支持松耦合&#xff0c;使代码易于维护。 2、实现思路 &#xff08;1&#xff09;、定义实体…

U-Net结构的特点

U-Net是一种用于图像分割的卷积神经网络架构&#xff0c;最初由Olaf Ronneberger等人提出&#xff0c;专门用于生物医学图像的分割任务。其设计特点和结构使其在各种图像分割任务中表现出色。以下是U-Net结构的主要特点和关键组件&#xff1a; 1. U形结构 U-Net的整体结构呈现…

使用arco design实现动态列信息的表格

目录 1.说明 2.普通表格的实现 3.动态表格的实现 1.说明 在前端画面中&#xff0c;表格一般用来展示列表数据&#xff0c;并且可以实现分页&#xff0c;应用很广泛&#xff0c;关于表格的列信息&#xff0c;一般是固定的&#xff0c;也可以是变化的&#xff0c;根据后端传递…

一文读懂 javascript 函数返回值

文章导读&#xff1a;AI 辅助学习前端&#xff0c;包含入门、进阶、高级部分前端系列内容&#xff0c;当前是 JavaScript 的部分&#xff0c;瑶琴会持续更新&#xff0c;适合零基础的朋友&#xff0c;已有前端工作经验的可以不看&#xff0c;也可以当作基础知识回顾。 这篇文章…

怎么提取pdf格式中的英语单词

思路&#xff1a; 第一步&#xff1a;适用python把需要导出的pdf文件单词导出到txt 第二步&#xff1a;把导出的txt导入到软件单词库&#xff0c;例如&#xff0c;金山词霸等软件内 第三步&#xff1a;熟练掌握以及删除单词库部分单词&#xff0c;达到对英文标准的单词记忆&…

0528-算法岗面试题

多模态 CLIP原理 描述对比学习函数 BLIP BLIP2架构和区别 LLaVa和BLIP2区别 LLaVa两阶段的训练过程和数据集的构建 LLaVa1.5 1.6的改进 cross-attention和self-attention区别 cross-attention在图文匹配中q和kv分别指什么&#xff0c;在机器翻译中分别指什么 one shot&#xf…

okcc呼叫中心如何创建语音群呼(通知)功能?

要在OKCC呼叫中心系统中创建语音群呼&#xff08;通知&#xff09;功能&#xff0c;您可以按照以下步骤进行&#xff1a; 准备语音通知内容&#xff1a; 确定您想要发送的语音通知内容&#xff0c;包括文字内容和语音录音。 配置群呼功能&#xff1a; 在OKCC呼叫中心系统的管理…

【Linux】-Kafka集群安装部署[18]

简介 Apache Kafka是一款分布式的、去中心化的、高吞吐低延迟、订阅模式的消息队列系统。 同RabbitMQ一样&#xff0c;Kafka也是消息队列。不过RabbitMQ多用于后端系统&#xff0c;因其更加专注于消息的延迟和容错。 Kafka多用于大数据体系&#xff0c;因其更加专注于数据的…

Oracle数据库之事务(十四)

在Oracle数据库中&#xff0c;事务是工作的逻辑单元&#xff0c;用于确保数据的一致性和完整性。以下是对Oracle事务的详细解释&#xff1a; 1. 定义 事务&#xff1a;在数据库中&#xff0c;事务是由一个或多个SQL语句组成的逻辑单元&#xff0c;这些语句共同完成一组相关的…

K210 数字识别 笔记

一、烧写固件 连接k210开发板&#xff0c;点开烧录固件工具&#xff0c;选中固件&#xff0c;并下载 二、模型训练 网站&#xff1a;MaixHub 1、上传文件 2、开始标记数据 添加9个标签&#xff0c;命名为1~9&#xff0c;按键盘w开始标记&#xff0c;键盘D可以下一张图片&…

解密Prompt系列15. LLM Agent之数据库应用设计:DIN C3 SQL-Palm BIRD

上一章我们主要讲搜索引擎和LLM的应用设计&#xff0c;这一章我们来唠唠大模型和DB数据库之间的交互方案。有很多数据平台已经接入&#xff0c;可以先去玩玩再来看下面的实现方案&#xff0c;推荐 [sql translate]&#xff1a;简单&#xff0c;文本到SQL&#xff0c;SQL到文本…

Github 2024-05-21 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-21统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目2C项目2TypeScript项目2非开发语言项目2Vim Script项目1Lua项目1Python项目1Batchfile项目1Go项目1Windows和Office激活工具 创建周期:…

<网络安全VIP>第一篇《工业互联网安全》

1 工业互联网介绍 工业互联网的网络是基础&#xff0c;平台是核心&#xff0c;安全是保障。信息化会提高工业化的生产效率&#xff0c;但信息化本身具备两面性。一方面它可以让信息交互更加顺畅&#xff0c;共享更加快捷&#xff1b;但另一方面是带来相应的安全威胁。 2 工业…

后端企业级开发之yaml数据序列化格式文件详解2024

yaml格式 数据格式 yaml 是一种数据序列化的格式 容易阅读 容易与脚本语言交互 以数据为核心 重数据轻格式 我们要知道他怎么书写 大小写敏感 属性层级关系使用多行描述 每行结尾使用冒号结束 使用缩进表示层级关系 同层级左侧对其 只运行使用空格 属性前面添加空格 #表…

学习前端滚动容器

学习前端滚动容器 一、前言1、创建基本的滚动容器组件2、解析代码 二、示例应用1、使用滚动容器组件2、创建滚动容器组件结语 一、前言 滚动容器是指在页面布局中可以垂直或水平滚动其内容的区域。这种技术通常用于处理内容过长而导致溢出的情况&#xff0c;例如长表单、大段文…

面试二十六、c++语言级别的多线程编程

一、 多线程编程 ​​​​​ 这里的c语言级别的多线程和linux的有一定的区别&#xff0c;c语言级别提供的多线程比较严格&#xff0c;如果主线程结束了&#xff0c;但是子线程没有结束&#xff0c;进程就会异常终止&#xff0c;而linux不会&#xff0c;会继续执行。 二、模拟卖…