网络编程之IO复用机制(多路IO转接)之select实现IO复用的思路02

2023-10-27

1 select实现IO复用的思路02

下面的都是伪代码,主要讲究思路。

  • 1)lfd=socket()。
  • 2)bind()。
  • 3)listen()。
  • 4)将lfd添加到select的读集合用于传入,借助内核帮我们监听事件,而不直接调用accept函数监听。为了方便我们只需要添加读集合即可。
fd_Set rset,allset;//rset为读监听的集合
FD_ZERO(&rset);
FD_SET(lfd,&rset);
  • 5)调用select函数实现IO复用。
int ret = select(lfd+1, &rset, NULL, NULL, NULL);//注意,当select执行完毕rset变成传出参数了
  • 6)然后将内核监听到的请求即请求连接(lfd触发),请求通信(cfd触发)进行处理。即利用select传出的参数rset文件描述符集合进行处理,因为rset里面是满足lfd,cfd的请求。如果有新客户端请求连接,那么lfd将在rset中,若客户端请求通信,那么cfd将在rset中,否则不在。这里需要注意,ret返回的总事件数只是能让你快速判断是否有请求事件发生,或者判断错误,实际作用一般就是这两个。
    select的所有的操作都是基于rset文件描述符集合来处理。
	//1 select的返回值一般用于判断错误
	if (ret < 0)
		perr_exit("select error");
		
	//2 判断客户端是否有新的请求建立连接
	if (FD_ISSET(listenfd, &rset)) { 
		/* new client connection */
		connfd = accept();
		//其它处理...
	}
	//3 遍历所有文件描述符,依次查看描述符是否在rset出现,若出现,说明客户端有对应请求。
	//即处理cfd通信描述符
	for(i = lfd + 1; i<=最大文件描述符数;i++){
		if(FD_ISSET(i, &rset)){
			//读写操作
		}
	}

以上就是select实现IO复用的思路,select不建议深入。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络编程之IO复用机制(多路IO转接)之select实现IO复用的思路02 的相关文章

  • Locale.getDefault() 始终返回 en

    unix 机器上的服务器始终使用 en 作为默认区域设置 以下是区域设置输出 LANG en US LC CTYPE C LC NUMERIC C LC TIME C LC COLLATE C LC MONETARY C LC MESSAG
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • 我可以从命令行打印 html 文件(带有图像、css)吗?

    我想从脚本中打印带有图像的样式化 html 页面 谁能建议一个开源解决方案 我使用的是 Linux Ubuntu 8 04 但也对其他操作系统的解决方案感兴趣 你可以给html2ps http user it uu se jan html2
  • 在哪里可以找到并安装 pygame 的依赖项?

    我对 Linux 比较陌生 正在尝试安装 python 的 pygame 开发环境 当我运行 setup py 时 它说我需要安装以下依赖项 我找到并安装了其中之一 SDL 然而 其他人则更加难以捉摸 Hunting dependencie
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 尝试安装 LESS 时出现“请尝试以 root/管理员身份再次运行此命令”错误

    我正在尝试在我的计算机上安装 LESS 并且已经安装了节点 但是 当我输入 node install g less 时 出现以下错误 并且不知道该怎么办 FPaulMAC bin paul npm install g less npm ER
  • PHP 从命令行启动 gui 程序,但 apache 不启动

    首先 我阅读了有类似问题的人的一些帖子 但所有答案都没有超出导出 DISPLAY 0 0 和 xauth cookies 这是我的问题 提前感谢您的宝贵时间 我开发了一个小库 它使用 OpenGL 和 GLSL 渲染货架 过去几天我将它包装
  • Linux:在文件保存时触发 Shell 命令

    我想在修改文件时自动触发 shell 命令 我认为这可以通过注册 inotify 挂钩并调用来在代码中完成system 但是是否有更高级别的 bash 命令可以完成此任务 尝试 inotify 工具 我在复制链接时遇到问题 抱歉 但 Git
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包

随机推荐

  • 2022 CISCN 创新能力实践赛初赛WP

    WP来自齐鲁师范学院网络安全社团 文章目录 MISC ez usb everlasting night babydisk WEB Ezpop online crt PWN login nomal CRY 基于挑战码的双向认证1 基于挑战码的
  • python 爬虫之 爬取网页并保存(简单基础知识)

    抓取网页效果图 代码在最后 基础知识认识 首先导入所需要的库 from fake useragent import UserAgent 头部库 from urllib request import Request urlopen 请求和打开
  • Tomcat远程访问不到的问题

    Android老人学SpringBoot Tomcat在Linux端部署 远程访问不到的解决思路 解决思路 Tomcat在Linux端部署 远程访问不到的解决思路 Linux环境配置 服务器部署等不详细说 默认大家已经做好了 老人小白 今天
  • Sql去重查询数据

    最近在工作过程中 面试过程中 部分求职者或者同事 对sql怎么去重查询 不是太熟练 今天下午忙里偷闲 整理了一下 其实sql基本的查询 还是蛮有意思 下面是我大致整理的几种去重查询 1 存在2条一样的数据 使用distinct eg sel
  • linux下mysql主从复制配置几种情况(库名不同、同步部分库表、忽略某几个表不同步等)

    前提条件 1 主从服务器操作系统版本和位数一致 2 Master 和 Slave 数据库的版本要一致 3 Master 和 Slave 数据库中的数据要一致 4 Master 开启二进制日志 Master 和 Slave 的 server
  • 78. 子集、90. 子集 II、491. 递增子序列

    78 子集 题目描述 给你一个整数数组 nums 数组中的元素 互不相同 返回该数组所有可能的子集 幂集 解集 不能 包含重复的子集 你可以按 任意顺序 返回解集 解答 子集问题其实和组合问题很相似 不同在于子集问题需要在每次取数后都存入结
  • R语言常用的绘图参数

    1 点线结构参数 在plot函数中 使用参数type来控制点线输出结构 参数type的取值及定义 参数取值 描述 type p 点 type l 线 type b 点连线 type o 线穿过点 type h 悬垂线 type s 阶梯线
  • Oracle ORA-00903:表名无效

    order是保留字 如果不小心用了order这个单词就只能加上双引号 order 操作
  • 报错:ABRT 已检测到 ‘1‘ 个问题。预了解详细信息请执行:abrt-cli list --since 1653881497

    文章目录 ABRT 已检测到 1 个问题 预了解详细信息请执行 abrt cli list since 1653881497 报错 表现 解决方案 检测 ABRT 已检测到 1 个问题 预了解详细信息请执行 abrt cli list si
  • python--继承

    1 python继承的基本概念 在程序中 继承描述的是多个类之间的所属关系 如果一个类A里面的属性和方法可以复用 则可以通过继承的方式 传递到类B里 那么类A就是基类 也叫做父类 类B就是派生类 也叫做子类 继承 描述的类与类之间所属关系
  • vue生命周期和整个渲染流程

    vue的生命周期分为8个阶段 beforecreate created beforemount mounted beforeupdate updated beforedestroy destroyed beforeCreate 在实例初始化
  • Cobalt Strike 插件汇总

    https github com 001SPARTaN aggressor scripts https github com 360 A Team CobaltStrike Toolset https github com C0axx Ag
  • 背包问题浅析(most basic version)

    什么是背包问题 给你一个背包 能装的物品重量有限 再给你一些物品和它的价值 问你能装下的最大价值是多少 这就是背包问题 其核心思想是动态规划 怎么做 设置一个dp i j 数组 表示在0 i个物品中能装下的最大价值 j表示背包的重量 核心
  • 微信小程序云开发:npm命令提示: ‘npm‘ 不是内部或外部命令,也不是可运行的程序

    文章目录 一 报错 1 1 安装node 1 2 node环境变量配置 一 报错 今天在学习小程序时 因为云函数中需要用到request promise这个模块 我就去复制安装命令发现报错如下 npm命令提示 npm 不是内部或外部命令 也
  • POJ--2709:Painter (贪心)

    1 题目源地址 http poj org problem id 2709 2 解题思路 每个颜料盒可能有3 12种颜色 其中每种颜色50ml 任意三种颜色 假设每种颜色Xml 可以混合出Xml的灰色 现在给出所需颜色的种数N 给出N个值分别
  • 不同路径(动态规划、dfs /LeetCode)

    题目链接 题目描述 一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start 机器人每次只能向下或者向右移动一步 机器人试图达到网格的右下角 在下图中标记为 Finish 问总共有多少条不同的路径 示例 1 输入 m
  • el-dialog 导致无法触发背后图层的鼠标事件的解决方法

    说明 如上图 el dialog 对话框出现时默认情况下是点击不了 点击测试123123 这个按钮的 因为 el dialog 出现时 属于最上层的图层 后面的图层会被它覆盖 导致触发不了后面图层的鼠标事件 上图是解决了这个问题之后可以点击
  • 使用UltralISO制作ubuntu启动盘

    1 从Ubuntu官网Ubuntu系统下载 Ubuntu下载系统的iso文件 用来制作的U盘需要是FAT32格式的 可以通过格式化U盘更改
  • 上传拍照的图片base64存储

    上传base64图片功能 这里只放了上传图片的实现类代码 业务逻辑 新增数据时 应该是先上传图片 然后把生产的uuid返回给前台 前台在新增数据时把图片id集合传给后台 拍照图片上传 param resourceChangePicReq 传
  • 网络编程之IO复用机制(多路IO转接)之select实现IO复用的思路02

    1 select实现IO复用的思路02 下面的都是伪代码 主要讲究思路 1 lfd socket 2 bind 3 listen 4 将lfd添加到select的读集合用于传入 借助内核帮我们监听事件 而不直接调用accept函数监听 为了