Day23 第十站 文件IO的多路复用

#include <myhead.h>void insert_client(int *client_arr,int *len,int client)
{//client_arr[n]={3,4} len=&client_count,client_count=2;//添加 5 client_arr[2(*len)]=5(client)client_arr[*len]=client;(*len)++;
}
int find_client(int *client_arr,int len,int client)
{for(int i=0;i<len;i++){if(client_arr[i]==client){return i;}}return -1;
}
void remove_client(int *client_arr,int *len,int client)
{int tar = find_client(client_arr,*len,client);if(tar==-1){return;}for(int i=tar;i<*len-1;i++){client_arr[i]=client_arr[i+1];}(*len)--;
}
int main(int argc, const char *argv[])
{
/*        FILE* fp = popen("hostname -I","r");char ip[32] = {0};fread(ip,32,1,fp);printf("ip = %s\n",ip);*/if(argc!=2){printf("请输入正确的端口号\n");}fd_set readfds;int port = atoi(argv[1]);FD_ZERO(&readfds);int client_arr[100]={0};int client_count=0;int server =socket(AF_INET,SOCK_STREAM,0);if(server==-1){perror("socket");return -1;}printf("socket success\n");int reuse =1;if(setsockopt(server,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("resue");return -1;}struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(port);sin.sin_addr.s_addr=inet_addr("192.168.2.97");if(bind(server,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind");return -1;}printf("bind success\n");if(listen(server,128)==-1){perror("listen");return -1;}FD_SET(server,&readfds);FD_SET(0,&readfds);//    fd_set writefds;//    FD_SET(0,&writefds);while(1){
/*            fd_set arr=writefds;select(FD_SETSIZE,&arr,0,0,0);if(FD_ISSET(0,&arr)==1){char buf[128]="";scanf("%s",buf);while(getchar()!=10);for(int i=0;i<client_count;i++){int fd = client_arr[i];write(fd,buf,sizeof(buf));}printf("发送成功\n");}*/fd_set temp=readfds;select(FD_SETSIZE,&temp,0,0,0);if(FD_ISSET(server,&temp)){int client=accept(server,0,0);printf("有新客户端连接\n");FD_SET(client,&readfds);insert_client(client_arr,&client_count,client);}for(int i=0;i<client_count;i++){int client = client_arr[i];//就是每一个套接字if(FD_ISSET(client,&temp)==1){char buf[128]="";int res = read(client,buf,128);//客户端断开连接 read函数根据阻塞状态不同 返回值是不同的//read如果是一个非阻塞函数,客户端断开连接 read返回0//read如果是一个阻塞函数,客户端断开连接 read返回-1if(res==0){printf("有客户端断开连接\n");FD_CLR(client,&readfds);remove_client(client_arr,&client_count,client);close(client);break;}printf("客户端发来消息:%s\n",buf);}}if(FD_ISSET(0,&temp)==1){char buf[128]="";scanf("%s",buf);while(getchar()!=10);for(int i=0;i<client_count;i++){int fd = client_arr[i];write(fd,buf,sizeof(buf));}printf("发送成功\n");}}return 0;
}work2.c#include <myhead.h>
int main(int argc, const char *argv[])
{int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("sfd");return -1;}int reuse =1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("sfd");return -1;}struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(6666);sin.sin_addr.s_addr=inet_addr("192.168.2.97");if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("find");return -1;}fd_set readfds;FD_ZERO(&readfds);FD_SET(sfd,&readfds);FD_SET(0,&readfds);while(1){fd_set temp = readfds;select(FD_SETSIZE,&temp,0,0,0);if(FD_ISSET(sfd,&temp)==1){char rbuf[128]="";read(sfd,rbuf,sizeof(rbuf));printf("数据为:%s\n",rbuf);}if(FD_ISSET(0,&temp)==1){char buf[128]="";scanf("%s",buf);while(getchar()!=10);int fd =sfd;write(fd,buf,sizeof(buf));printf("发送成功\n");}}close(sfd);return 0;
}

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

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

相关文章

【Python开发实践】在线商城系统——需求及需求分析

项目背景及需求 这个练习项目的设置背景是一家图书销售公司&#xff0c;为了扩大销售渠道&#xff0c;想要开通网上商城&#xff0c;利用在线博客和电子商城来销售图书。 具体需求如下&#xff1a; 每个商品可以留言 实现在线购物车处理和订单处理 实现对产品、购物车和订单的…

python依赖包安装失败的解决办法(适用于conda安装)

版权声明&#xff1a;本文为博主原创文章&#xff0c;如需转载请贴上原博文链接&#xff1a;python依赖包安装失败的解决办法&#xff08;适用于conda安装&#xff09;-CSDN博客 前言&#xff1a;这个问题之前一直困扰着我&#xff0c;因为最近要升级Anaconda-Navigator&#x…

haproxy实验

基本介绍 http://t.csdnimg.cn/Z64QVhttp://t.csdnimg.cn/Z64QV 实验环境 功能IP客户端172.25.254.233haproxy eth0:172.25.254.100 eth1:192.168.0.10 rs1eth0:192.168.0.101rs2eth0:192.168.0.102 安装haproxy yum install haproxy -y 多进程和多线程 vim /etc/hap…

基于Conda的Python版本管理与Python包管理

文章目录 前言Conda是什么Conda与Anaconda安装Anaconda安装包windows v2024.06-1安装包更多版本安装包(Windows/Mac/Linux) 安装添加环境变量安装过程中遇到的问题 使用步骤创建Python环境激活Python环境安装Python包列出和切换 Python 版本管理多个环境 总结 前言 开发环境中…

力扣 1425带限制的子序列和

这是一道 动态规划加单调队列的题&#xff0c;重点加强单调队列知识的学习 回归本题&#xff0c;这个题中&#xff0c;动态规划的部分略去&#xff0c;状态转移方程可求 单调队列部分 1维护队头 if(i-sta.front() k) sta.pop_front(); 2维护队尾 while(!sta.empty() &…

[C#]基于winform结合photocartoon算法实现人物卡通化源码实现

【官方框架】 https://github.com/minivision-ai/photo2cartoon 简介 人像卡通风格渲染的目标是&#xff0c;在保持原图像ID信息和纹理细节的同时&#xff0c;将真实照片转换为卡通风格的非真实感图像。我们的思路是&#xff0c;从大量照片/卡通数据中习得照片到卡通画的映射…

2024年思维导图工具怎样可以轻松选择

思维导图&#xff0c;作为一种直观、有效的思维工具&#xff0c;凭借其强大的信息整理能力和创意激发潜力&#xff0c;逐渐成为了人们学习、工作和生活中不可或缺的一部分。今天&#xff0c;就让我们一起走进这个充满智慧的领域&#xff0c;探索那些2024年大家都在使用的思维导…

Mac安装Typora

文章目录 介绍软件功能下载安装1.下载完成后打开downloads 双击进行安装2.将软件拖到应用程序中3.在程序坞中搜索打开4.提示安全问题就打开通用&#xff0c;安全隐私与设置5.打开成功 小结 介绍 Typora for mac 是一款简洁的轻量级的markdown编辑器、写作软件。它去除了预览窗…

C++求职LinuxWebServer面试篇(项目介绍)

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ Qt5.9专栏定期更新Qt的一些项目Demo 项目与…

Tomcat性能调优

Tomcat性能调优 Tomcat9参数配置&#xff1a;Apache Tomcat 9 Configuration Reference (9.0.93) - The HTTP Connector 2.1 如何监控Tomcat的性能 Tomcat 的关键指标 Tomcat 的关键指标有吞吐量、响应时间、错误数、线程池、CPU 以及 JVM 内存。前三个指标是我们最关心的业…

JVM指令重排序

文章目录 什么是指令重排序编译器优化JIT 编译优化处理器优化重排序数据依赖性 硬件层的内存屏障指令重排的代码验证好处减少管道阻塞提高缓存利用率利用并行执行单元性能提升更好地利用硬件资源 问题内存可见性问题编程复杂性增加调试困难 解决方案&#xff1a;Java内存模型&a…

Pinia

搭建pinia环境 1.引入依赖 npm i pinia 2.在main.ts中引入pinia 准备一个基本的效果 <template><h2>测试一下pinia</h2><br><span>当前求和为&#xff1a;{{ sum }}</span><br><select v-model.number"n"><o…

2 kubeflow系统架构 学习笔记

1 Kubeflow生态系统 2 生态系统说明 2.1. Hardware&#xff08;硬件层&#xff09; 提供计算资源的底层硬件支持。GPU&#xff08;如NVIDIA&#xff09;通常用于加速机器学习和深度学习的计算任务&#xff0c;而Intel和AMD则可能提供CPU计算资源。 2.2. Infrastructure&…

[OC]萝卜圈玩行车记录仪

图1-1&#xff0c;你的手动小车 代码是 #机器人驱动主程序 #请在main中编写您自己的机器人驱动代码 import tkinter as tk import turtle v0 # 速度 accFalse;slowFalse;leftFalse;rightFalse # 按键状态 step0.5 # 一次速度变化量 def keyup_press(event):global acc;accTru…

「数组」希尔排序 / 区间增量优化(C++)

目录 概述 思路 核心概念&#xff1a;增量d 算法过程 流程 Code 优化方案 区间增量优化 Code(pro) 复杂度 概述 我们在「数组」冒泡排序|选择排序|插入排序 / 及优化方案&#xff08;C&#xff09;中讲解了插入排序。 它有这么两个特点&#xff1a; ①待排序元素较…

[Qt][Qt 文件]详细讲解

目录 1.输入输出设备类2.文件读写类3.文件和目录信息类 1.输入输出设备类 在Qt中&#xff0c;⽂件读写的类为QFile&#xff0c;其⽗类为QFileDevice QFileDevice提供了⽂件交互操作的底层功能QFileDevice的⽗类是QIODevice&#xff0c;其⽗类为QObject QIODevice是Qt中所有I/O…

【企业高性能web服务器】

目录 一、Nginx 介绍1、 Nginx 功能介绍2、基础特性3、Nginx 模块介绍 二、Nginx 编译安装1、编写systemd服务 三、平滑升级和回滚1、平滑升级的流程2、升级2、回滚 四、 Nginx 核心配置详解1、实现 nginx 的高并发配置2、Nginx 账户认证功能3、nginx作为下载服务器配置 五、re…

QT-监测文件内容重复工具)

QT-监测文件内容重复工具 一、演示效果二、核心代码三、下载链接 一、演示效果 二、核心代码 #include "widget.h" #include "ui_widget.h" #include <QDir> #include <QFile> #include <QCryptographicHash> #include <QApplicatio…

如何用Python构建高校爬虫与k-means算法实现专业评分可视化分析

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

多线程、多进程,还是异步?-- Python 并发 API 如何选择

如何选择正确的 Python 并发 API模块 &#xff1f; Python 标准库提供了三种并发 API &#xff0c; 如何知道你的项目应该使用哪个 API&#xff1f; 在本教程将带逐步了解各API的特性、区别以及各自应用场景&#xff0c;指导你选择最合适的并发 API。 多线程、多进程&#xff0…