select实现io复用

select实现tcp并发服务器(还没有实现完成)

 20 #include <sys/un.h>21 #define PORT 888822 #define IP "192.168.126.52"23 int main(int argc, const char *argv[])24 {25     //1:获取网络通信端点26     int sfd=socket(AF_INET,SOCK_STREAM,0);27     if(sfd==-1)28     {29         perror("socket error");30         return -1;31     }32     printf("socket success,sfd=%d\n",sfd);33 34     //2:绑定ip 端口号35     struct sockaddr_in sin;36     sin.sin_family=AF_INET;37     sin.sin_port=htons(PORT);38     sin.sin_addr.s_addr=inet_addr(IP);39     if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)40     {41         perror("bind error");42         return -1;43     }44     printf("bind success\n");45 46     //3:将套接字设置成被动监听状态47     if(listen(sfd,128)==-1)48     {49         perror("listen error");50         return -1;51     }52     printf("listen success\n");53 54     //4:阻塞等待客户端连接55     //定义接收客户端信息容器56     struct sockaddr_in cin;57     socklen_t addrlen=sizeof(cin);58     int newfd=-1;//新建用于通信的套接字文件59     char rbuf[128]="";//键盘上输入数据60 61     //11:创建fd_set类型的变量,作为文件描述符容器62     fd_set readfds,tempfds;63     //12:清空容器64     FD_ZERO(&readfds);65     //13:将SFD和0号文件描述符放入66     FD_SET(sfd,&readfds);67     FD_SET(0,&readfds);68 69     //随着客户端newfd的产生,sfd不在是集合中的文件描述符的最大值70     int maxfd=sfd;//存放容器中最大文件描述符的最大值71 72     while(1)//对多个客户端处理,加上循环73     {74         tempfds=readfds;//将容器复制一份,因为select函数会删除容器中未触发事件的文件描述符75         //阻塞等待集合中事件产生76         int res=select(maxfd+1,&tempfds,0,0,0);77         if(res==0)78         {79             printf("timeout\n");80             return -1;81         }82         else if(res==-1)83         {84             perror("select error");85             return -1;86         }87 88         //如果程序执行到此,说明select集合中有事件发生89         //接下来判断哪个文件描述符发生了事件,发生了事件的文件描述符会留下,其他删除90     if(FD_ISSET(sfd,&tempfds))  //如果sfd在集合中,说明sfd执行了事件解除了阻塞91     {92         newfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);93         if(newfd==-1)94         {95             perror("accept error");96             return -1;97         }98         printf("newfd=%d,新用户上线,ip地址为%s,端口号为%d\n",newfd,inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));99 
100 
101         //将客户端文件描述符放入集合中
102         FD_SET(newfd,&readfds);
103         //当有新的文件描述符加入到集合中,更新文件描述符的最大值
104         if(newfd>maxfd)
105         {
106             maxfd=newfd;
107         }
108     }
109 
110 
111     if(FD_ISSET(0,&tempfds))//如果0号描述符在集合中,说明0号描述符执行了事件
112     {
113         //键盘上输入事件
114         fgets(rbuf,sizeof(rbuf),stdin);
115         rbuf[strlen(rbuf)-1]=0;
116         printf("触发了键盘输入事件:%s\n",rbuf);
117     }
118 
119     if(FD_ISSET(newfd,&tempfds))//如果newfd在集合中说明客户端执行了事件,执行客户端的代码
120     {
121 
122 /*  FD_SET(0,&readfds);//事件出发后会删除未触发事件的文件描述符,所以最后添加,但是比较麻烦不用
123     FD_SET(sfd,&readfds); //解决方法是复制一份容器*/
124 
125         //5:与客户端进行通信
126         char rbuf[128]="";
127         //while(1) 不需要循环了,循环会导致键盘任务无法触发
128         //{
129             bzero(rbuf,sizeof(rbuf));
130             int res=recv(newfd,rbuf,sizeof(rbuf),0);
131             if(res==0)
132             {
133                 printf("对方已下线\n");
134             //  break;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
135                 close(newfd);//关闭套接字
136                 continue;//退出进行下一轮while循环会导致键盘任务无法触发
137 
138                 //将当前关闭的文件描述从readfd集合中移除
139                 FD_CLR(newfd,&readfds);
140                 //更新maxfd
141 
142             }
143             printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);
144             strcat(rbuf,"<<<>>>");
145             send(newfd,rbuf,sizeof(rbuf),0);
146             printf("sned success\n");
147     //  }
148 
149     }
150     }
151     close(sfd);
152 
153     return 0;
154 }
~                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
~                

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

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

相关文章

修改了vue3 <script setup>留言板

Лунная ночь <template><button class"edit_view_checkbox"><input type"checkbox" v-model"editshowInput" value"编辑" /></button><div class"editshowInput" v-if"editshowI…

Python常见面试题(三)——numpy和pandas

主要讲二者的结合应用 1、基础函数的应用 frame pd.DataFrame(np.random.randn(4, 3), columnslist(bde), index[Utah, Ohio, Texas, Oregon]) 2、lambda函数 也叫匿名函数&#xff0c;即&#xff0c;函数没有具体的名称&#xff0c;不用考虑函数命名&#xff1b;使用lamb…

Spring MVC+mybatis 项目入门:旅游网(二) dispatcher与controller与Spring MVC

个人博客&#xff1a;Spring MVCmybatis 项目入门:旅游网&#xff08;二&#xff09;dispatcher与controller与Spring MVC | iwtss blog 先看这个&#xff01; 这是18年的文章&#xff0c;回收站里恢复的&#xff0c;现阶段看基本是没有参考意义的&#xff0c;技术老旧脱离时代…

若依ruoyi-vue element-ui 横向滚动条 动态横向滚动条

动态横向滚动条 因为每次横向滑动都要到底部&#xff0c;引入插件 https://github.com/mizuka-wu/el-table-horizontal-scroll //动态横向滚动条移入样式 .el-table-horizontal-scrollbar :hover{//高度 变大10%transform: scaleY(1.5) translateY(-10%);//百分之八十亮度&a…

【Spring-01】BeanFactory和ApplicationContext

【Spring-01】BeanFactory和ApplicationContext 1. 容器接口1.1 什么是 BeanFactory1.2 BeanFactory 能做什么&#xff1f; 1. 容器接口 以 SpringBoot 的启动类为例&#xff1a; /*** BeanFactory 与 ApplicationContext的区别*/ SpringBootApplication public class Spring…

Grafana详解

目录 ​编辑 一、Grafana的主要特点 二、Grafana的基本功能 三、Grafana的使用方法 Grafana是一款开源的数据可视化工具&#xff0c;主要用于大规模指标数据的可视化展现。下面将详细介绍Grafana的特点、功能以及基本使用方法。 一、Grafana的主要特点 跨平台性&#xff…

牛客ONT45 距离是K的二叉树节点【中等 宽度优先遍历 Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/e280b9b5aabd42c9b36831e522485622 思路 图&#xff0c;队列 构件图&#xff0c;直接从target出发&#xff0c;扩展到第k层就是答案Java代码 import java.util.*;/** public class TreeNode {* int val 0;* …

vue3+vite解决项目打包后本地图片等资源找不到的问题

1.在vite.config.js里面做如下配置 import { defineConfig } from vite import vue from vitejs/plugin-vueexport default defineConfig({base: ./, // 打包的静态资源引用路径plugins: [vue()], // 放插件用的resolve: {alias: {: /src // 配置/提示符}}, })上述配置主要就是…

C++迈向精通:vector复现与sort复现

vector复现 思考过程 对于vector考虑如下几点&#xff1a; 底层数据结构算法实现方式对外表现形式 这里底层的数据结构采用了顺序表&#xff0c;当然&#xff0c;原版STL中的vector也是采用的顺序表。 算法实现的方式放在代码中去设计 对外表现形式是数组&#xff0c;因此需…

[IMX6ULL驱动开发]-Linux对中断的处理(二)

上一篇文章中&#xff0c;引入了Linux对于中断的一些简略流程以及中断抽象为具体实际形象。此文章主要是继续加深对Linux对中断的处理流程以及一些相应的数据结构。 目录 Linux对中断的扩展&#xff1a;硬件中断、软件中断 多中断处理 中断上下部处理流程 发生中断A&#…

Nginx R31 doc-15-Live Activity Monitoring 实时活动监控

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

SpringBoot整合SpringSecurit,实现ajax的登录、退出、权限校验

1、本文章中SpringBoot整合SpringSecurity&#xff0c;只是基于session方式&#xff0c;并且没有使用到redis。 2、登录、登出都是通过ajax的方式进行。 项目目录&#xff1a; 1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xm…

FastReport 主子表关系

代码中只需要绑定主表的数据就可以&#xff0c;子表的数据会通过报表中的关连关系自动到数据库中带出。 using CloudSaaS.DB.Handler; using CloudSaaS.Model; using CloudSaaS.DAL; using FastReport; using FastReport.Web; using System; using System.Collections.Generic;…

(2020|ICML PMLR,线性 Transformer,核函数,RNN)Transformer 是 RNN

Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 线性 Transformers 3.1. Transformer 3.2.…

2023、2024国赛web复现wp

2023 Unzip 类型&#xff1a;任意文件上传漏洞 主要知识点&#xff1a;软链接 随便上传一个一句话木马文件&#xff0c;得到一串php代码 根据代码上传zip文件发现进入后还是此页面 代码审计&#xff1a; <?php error_reporting(0); highlight_file(__FILE__);$finfo fin…

Stable Diffusion【写实模型】:逼真,逼真,超级逼真的国产超写实摄影大模型万享XL

今天和大家分享的是一个国产万享系列中使用量最高的大模型:万享XL_超写实摄影&#xff0c;顾名思义&#xff0c;该大模型主要是面向写实摄影&#xff0c;一方面生成的图片人物皮肤纹理细节超级逼真&#xff0c;另一方面对于光影效果的处理也非常到位。对于万享XL超写实摄影大模…

jQuery 下载与快速入门指南

引言 jQuery 是一个广泛使用的 JavaScript 库&#xff0c;它极大地简化了客户端的 HTML 文档遍历、事件处理、动画以及Ajax交互&#xff0c;让Web开发者能够更加高效地实现动态网页效果。本文将指导你如何下载jQuery&#xff0c;并提供一个简单的入门示例来展示其基本用法。 …

揭秘Tensor Core黑科技:如何让AI计算速度飞跃

揭秘 Tensor Core 底层&#xff1a;如何让AI计算速度飞跃 Tensor Core&#xff0c;加速深度学习计算的利器&#xff0c;专用于高效执行深度神经网络中的矩阵乘法和卷积运算&#xff0c;提升计算效率。 Tensor Core凭借混合精度计算与张量核心操作&#xff0c;大幅加速深度学习…

参数高效微调PEFT(二)快速入门P-Tuning、P-Tuning V2

参数高效微调PEFT(二)快速入门P-Tuning、P-Tuning V2 参数高效微调PEFT(一)快速入门BitFit、Prompt Tuning、Prefix Tuning 今天&#xff0c;我们继续了解下来自清华大学发布的两种参数高效微调方法P-Tuning和P-Tuning v2。可以简单的将P-Tuning是认为针对Prompt Tuning的改进…

(二)MySQL 存储引擎

欢迎访问 1. MySQL ⽀持哪些存储引擎&#xff1f;默认使⽤哪个&#xff1f; MyISAM 和 InnoDB&#xff0c;默认InnoDB 2.MyISAM 和 InnoDB 有什么区别&#xff1f; 事务支持&#xff1a; InnoDB 支持事务&#xff0c;具有 ACID&#xff08;原子性、一致性、隔离性、持久性&a…