【Linux】多路IO转接问题-select

select:

首先设置一个lfd绑定服务端地址结构,用于监听新的连接。select函数调用,用于对整个fd数组进行监听,该数组最大限制1024,通过遍历,来确定是哪个fd有变化:
1.如果是lfd:那么可能是新的连接进来,就要调用accept阻塞监听获得这个新的连接,将fd加入到数组中;
2.其他fd,有可能是需要断开连接,也有可能是要有数据传输。
在这里插入图片描述

1.#include <stdio.h>  
2.#include <stdlib.h>  
3.#include <unistd.h>  
4.#include <string.h>  
5.#include <arpa/inet.h>  
6.#include <ctype.h>  
7.  
8.#include "wrap.h"  
9.  
10.#define SERV_PORT 6666  
11.  
12.int main(int argc, char *argv[])  
13.{  
14.    int i, j, n, nready;  
15.  
16.    int maxfd = 0;  
17.  
18.    int listenfd, connfd;  
19.  
20.    char buf[BUFSIZ];         /* #define INET_ADDRSTRLEN 16 */  
21.  
22.    struct sockaddr_in clie_addr, serv_addr;  
23.    socklen_t clie_addr_len;  
24.  
25.    listenfd = Socket(AF_INET, SOCK_STREAM, 0);    
26.    int opt = 1;  
27.    setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));  
28.    bzero(&serv_addr, sizeof(serv_addr));  
29.    serv_addr.sin_family= AF_INET;  
30.    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);  
31.    serv_addr.sin_port= htons(SERV_PORT);  
32.    Bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));  
33.    Listen(listenfd, 128);  
34.      
35.  
36.    fd_set rset, allset;                            /* rset 读事件文件描述符集合 allset用来暂存 */  
37.  
38.    maxfd = listenfd;  
39.  
40.    FD_ZERO(&allset);  
41.    FD_SET(listenfd, &allset);                                  /* 构造select监控文件描述符集 */  
42.  
43.    while (1) {     
44.        rset = allset;                                          /* 每次循环时都从新设置select监控信号集 */  
45.        nready = select(maxfd+1, &rset, NULL, NULL, NULL);  
46.        if (nready < 0)  
47.            perr_exit("select error");  
48.  
49.        if (FD_ISSET(listenfd, &rset)) {                        /* 说明有新的客户端链接请求 */  
50.  
51.            clie_addr_len = sizeof(clie_addr);  
52.            connfd = Accept(listenfd, (struct sockaddr *)&clie_addr, &clie_addr_len);       /* Accept 不会阻塞,因为已经知道要有连接了,所以直接连接 */  
53.  
54.            FD_SET(connfd, &allset);                            /* 向监控文件描述符集合allset添加新的文件描述符connfd */  
55.  
56.            if (maxfd < connfd)  
57.                maxfd = connfd;  
58.  
59.            if (0 == --nready)                                  /* 只有listenfd有事件, 后续的 for 不需执行 */  
60.                continue;  
61.        }   
62.  
63.        for (i = listenfd+1; i <= maxfd; i++) {                 /* 检测哪个clients 有数据就绪 */  
64.  
65.            if (FD_ISSET(i, &rset)) {  
66.  
67.                if ((n = Read(i, buf, sizeof(buf))) == 0) {    /* 当client关闭链接时,服务器端也关闭对应链接 */  
68.                    Close(i);  
69.                    FD_CLR(i, &allset);                        /* 解除select对此文件描述符的监控 */  
70.  
71.                } else if (n > 0) {  
72.  
73.                    for (j = 0; j < n; j++)  
74.                        buf[j] = toupper(buf[j]);  
75.                    Write(i, buf, n);  
76.                }  
77.            }  
78.        }  
79.    }  
80.  
81.    Close(listenfd);  
82.  
83.    return 0;  

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

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

相关文章

Python编程练习与解答 练习93:在终端窗口居中一个显示字符串

编写一个函数&#xff0c;以字符串s作为第一个参数&#xff0c;以窗口的字符宽度w作为第二个参数。函数将返回一个新字符串&#xff0c;其中包括所需的前导空格&#xff0c;以便在打印时新字符串s在窗口居中显示。新字符串的构造方法如下&#xff1a; 如果s的长度大于或等于窗口…

Python基础以及代码

Python基础以及代码 1.第一个代码如下&#xff1a; # 项目&#xff1a;第一个项目 # 作者&#xff1a;Adair # 开放时间&#xff1a; 2023/8/15 21:52print("Hello,world!!")如图所示&#xff1a; 2.数字的代码如下&#xff1a; # 项目&#xff1a;演示第一个项…

自然语言处理(六):词的相似性和类比任务

词的相似性和类比任务 在前面的章节中&#xff0c;我们在一个小的数据集上训练了一个word2vec模型&#xff0c;并使用它为一个输入词寻找语义相似的词。实际上&#xff0c;在大型语料库上预先训练的词向量可以应用于下游的自然语言处理任务&#xff0c;为了直观地演示大型语料…

Kubernetes技术--k8s核心技术 Secret

1.概述 Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。Secret可以以 Volume 或者环境变量的方式使用。 作用 加密数据存储在/etc中,使得pod容器以挂载volume方式进行访问。在进行的数据存储中是以base64加密的方式…

C++ struct 笔记(超级详细)

今日碎碎念&#xff1a;我在学C语言时经常用到结构体struct&#xff0c;之后在写C程序时遇到在struct中定义构造函数和成员函数的情况&#xff0c;这在c语言中是从未遇到过的&#xff0c;觉得奇怪&#xff0c;想到之前并没有真正系统学习C里的struct&#xff0c;有必要今天详细…

leetcode - 360周赛

一&#xff0c;2833. 距离原点最远的点 这道题的意思是&#xff0c;遇到 "L" 向左走&#xff0c;遇到 "R" 向右走&#xff0c;遇到 "_" 左右都可以走&#xff0c;那么要想找到距离原点最远的点&#xff0c;就是在找 | "L" "R&qu…

P1093 [NOIP2007 普及组] 奖学金

题目描述 某小学最近得到了一笔赞助&#xff0c;打算拿出其中一部分为学习成绩优秀的前 5 5 5 名学生发奖学金。期末&#xff0c;每个学生都有 3 3 3 门课的成绩:语文、数学、英语。先按总分从高到低排序&#xff0c;如果两个同学总分相同&#xff0c;再按语文成绩从高到低排…

代码随想录 - Day31 - 回溯:组合问题

代码随想录 - Day31 - 回溯&#xff1a;组合问题 77. 组合 最容易想到的&#xff1a;k层for循环。 显然不能写那么多层for循环&#xff0c;所以该方法pass 使用回溯法&#xff1a; 用递归解决嵌套层数的问题 n相当于树的宽度&#xff0c;k相当于树的深度。 找到最深处的叶子节…

纵行科技与山鹰绿能达成合作,提供物联网资产管理数据服务

近日&#xff0c;纵行科技与山鹰绿能宣布双方达成深度合作关系&#xff0c;纵行科技将为山鹰绿能提供专业的物联网技术服务&#xff0c;使用物联网技术帮助山鹰绿能对循环包装载具等资产进行在线管理和数字化运营。 据悉&#xff0c;山鹰绿能是一家由山鹰国际控股的全资子公司…

前端将UTC时间格式转化为本地时间格式~~uniapp写法

UTC时间格式是什么 首先我们先简单的了解一下&#xff1a;UTC时间&#xff08;协调世界时&#xff0c;Coordinated Universal Time&#xff09;使用24小时制&#xff0c;以小时、分钟、秒和毫秒来表示时间 HH:mm:ss.SSSHH 表示小时&#xff0c;取值范围为00到23。mm 表示分钟…

Compose学习 - 环境配置及compose、kotlin插件、gradle、AndroidStudio版本对应关系

最近学习Compose&#xff0c;一开始学习的Compose版本是1.1.1&#xff0c;学习的过程中发现&#xff0c; LazyHorizontalGrid这个方法只有在1.2.0以后版本才支持。 想着既然要升级&#xff0c;直接用最新的好了。后面按照官网建议&#xff0c;下载了最新的AndroidStudio&#…

MySQL高阶查询语句

目录 1、按关键字排序 ASC和DESC 按分数排序&#xff0c;默认不指定是升序排列 分数按降序排列 区间判断及查询不重复记录 AND/OR ——且/或&#xff08;继续1.2实验环境&#xff09; 嵌套多条件 2、 对结果进行分组 语法 按hobbid相同的分组&#xff0c;计算相同分数的学生个…

知识图谱实战应用26-基于知识图谱构建《本草纲目》的中药查询与推荐项目应用

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用26-基于知识图谱构建《本草纲目》的中药查询与推荐项目应用,本文通过Py2neo连接到知识图谱数据库,系统实现了中药的快速查询、关系分析、智能推荐和知识展示等功能。用户可以输入中药的名称或特征进行查询,系统将从知…

音视频 ffmpeg命令转封装

保持编码格式&#xff1a; ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.ts ffmpeg -i test.mp4 -codec copy test_copy2.ts改变编码格式&#xff1a; ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv修改帧率&#xff1a; ffmpeg -i …

在Windows10上编译grpc工程,得到protoc.exe和grpc_cpp_plugin.exe

grpc是google于2015年发布的一款跨进程、跨语言、开源的RPC(远程过程调用)技术。使用C/S模式&#xff0c;在客户端、服务端共享一个protobuf二进制数据。在点对点通信、微服务、跨语言通信等领域应用很广&#xff0c;下面介绍grpc在windows10上编译&#xff0c;这里以编译grpc …

计算机网络-笔记-汇总

目录 &#x1f4da; 前言 &#x1f338;章节汇总 &#x1f680; 学习心得 ⌛2023年8月31日 星期四 &#x1f4da; 前言 在学习了【操作系统】、【计算机组成原理】之后 再来学习【计算机网络】&#xff0c;对计算机之间如何通信&#xff0c;有了一个大致的认识。 可以想象…

MATLAB实现AHP层次分析法——以情人节选取礼物为例

问题背景&#xff1a; 情人节来临之际&#xff0c;广大直男&#xff08;女&#xff09;同胞在给异性朋友选购礼物时会遇到难题——什么才是礼物好坏最重要的标准&#xff1f;基于层次分析法AHP进行计算&#xff0c;得出最高权重的指标&#xff0c;给出各位朋友选购礼物的一种思…

PY32F003F18P单片机概述

PY32F003F18P单片机是普冉的一款ARM微控制器&#xff0c;内核是Cortex-M0。这个单片机的特色&#xff0c;就是价格便宜&#xff0c;FLASH和SRAM远远超过8位单片机&#xff0c;市场竞争力很强大。 一、硬件资源&#xff1a; 1)、FLASH为64K字节&#xff1b; 2)、SRAM为8K字节&…

无涯教程-JavaScript - CUBEKPIMEMBER函数

描述 该函数返回关键绩效指标(KPI)属性,并在单元格中显示KPI名称。 语法 CUBEKPIMEMBER (connection, kpi_name, kpi_property, [caption])争论 Argument描述Required/OptionalconnectionName of the connection to the cube - A text stringRequiredkpi_nameName of the K…

axios 或 fetch 如何实现对发出的请求的终止?

终止 HTTP 请求是一个重要的功能&#xff0c;特别是在需要优化性能、避免不必要的请求或在某些事件发生时&#xff08;例如用户点击取消&#xff09;中断正在进行的请求时。以下是如何使用 axios 和 fetch 实现请求终止的方法&#xff1a; 1. axios axios 使用了 CancelToken…