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

news2024/11/27 7:35:25

#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返回-1
                    if(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.coloradmin.cn/o/2060743.html

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

相关文章

Spring DI 数据类型—— set 方法注入

首先新建项目&#xff0c;可参考 初识IDEA、模拟三层--控制层、业务层和数据访问层 一、spring 环境搭建 &#xff08;一&#xff09;pom.xml 导相关坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.or…

代码随想录算法训练营第二十二天| 77. 组合 216.组合总和III 17.电话号码的字母组合

77. 组合 题目&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2&#xff1a…

VAuditDemo安装漏洞

目录 VAuditDemo安装漏洞 index.php header.php config.php lib.php install.php 分析结果 漏洞利用 第一步&#xff1a;删除install.lock文件&#xff0c;访问 install.php 抓包 第二步&#xff1a;通过审计构造payload 第三步&#xff1a;修改抓包请求内容&#x…

客户分级管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示为什么选择我官方认证闲鱼玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参考源码获取…

《python语言程序设计》2018版第7章第10题设计一个名为time的类,包括hour minute second

#main代码段 def main():a int(time.time())total_second int(a)current_second total_second % 60total_minutes total_second // 60current_minute total_minutes % 60total_hours total_minutes // 60current_hour total_hours % 24b exCode07.Time(current_hour,cu…

SpringBoot中生成二维码的案例实战

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

基于数据复杂度的数据库选型

数据模型的选择对于 IT 系统的开发至关重要&#xff0c;它不仅决定了数据存储和处理的方式&#xff0c;影响系统的性能、扩展性以及维护性等。本质上来说&#xff0c;不同的数据模型反映了我们对业务问题的不同思考和抽象程度。 今天我们从不同数据模型对于复杂数据和关系的支…

定制化三防平板:为专业领域打造的坚固解决方案

在科技时代&#xff0c;移动设备已经成为各行各业不可或缺的工具。然而&#xff0c;对于一些特殊行业&#xff0c;如军事、野外勘探、物流、医疗和制造业等&#xff0c;普通商用平板往往无法满足其严苛的工作环境需求。三防平板&#xff0c;以其卓越的防护性能和高度的定制化能…

有了这4款工具,你就知道电脑怎么录屏了!

电脑屏幕录屏这个问题很多人都会碰到&#xff0c;比如教学视频录制&#xff0c;游戏技巧分享&#xff0c;软件操作演示等等。因为场景众多&#xff0c;电脑自带的录屏功能不一定能满足&#xff0c;所以借助第三方工具是一个很有效的办法。如果大家不知道如何录屏&#xff0c;可…

网络安全-安全策略初认识

文章目录 前言理论介绍1. 安全策略1.1 定义&#xff1a;1.2 关键术语&#xff1a; 2. 防火墙状态监测 实战步骤1&#xff1a;实验环境搭建步骤2&#xff1a;配置实现 总结1. 默认安全策略2. 自定义安全策略3. 防火墙状态会话表 前言 who&#xff1a;本文主要写给入门防火墙的技…

【Vue3】集成 Ant Design Vue

【Vue3】集成 Ant Design Vue 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗…

SX_gitlab可视化操作c语言知识_17

gitlab可视化操作技巧: Merge into current branch直接将远程wjc_GNSS分支的数据拉下来同步到本机当前的分支代码&#xff0c;执行的是合并操作&#xff0c;即多的模块会添加到本地分支&#xff0c;有冲突的地方不行得rebase覆盖才行 修改完代码先暂存更改再在暂存区写入备注&a…

特斯拉FSD硬件进化

特斯拉FSD硬件进化 历经十年&#xff0c;特斯拉自动驾驶软硬件系统不断进化。硬件&#xff1a;HW1.0 到 HW4.0&#xff0c;自研比例与配置性能不断提升。 2013 年&#xff0c;马斯克于推特披露特斯拉正在进行辅助驾驶系统 AP&#xff08;Autopilot System&#xff09;的研发&…

鸿蒙(API 12 Beta3版)【使用ImageSource完成图片解码】图片开发指导

图片解码指将所支持格式的存档图片解码成统一的[PixelMap]&#xff0c;以便在应用或系统中进行图片显示或[图片处理]。当前支持的存档图片格式包括JPEG、PNG、GIF、WebP、BMP、SVG、ICO、DNG。 开发步骤 全局导入Image模块。 import { image } from kit.ImageKit;获取图片。…

Compose知识分享

前言 “Jetpack Compose 是一个适用于 Android 的新式声明性界面工具包。Compose 提供声明性 API&#xff0c;让您可在不以命令方式改变前端视图的情况下呈现应用界面&#xff0c;从而使编写和维护应用界面变得更加容易。” 以上是Compose官网中对于Compose这套全新的Androi…

MidJourney付费失败的原因以及失败后如何取消或续订(文末附MidJourney,GPT-4o教程)

MidJourney付费失败的原因 MidJourney付费失败的原因可能包括支付方式无效、支付信息错误、网络问题、账户设置问题等。 ‌支付方式无效或信息错误‌&#xff1a;如果用户提供的支付方式&#xff08;如信用卡&#xff09;信息不正确&#xff0c;或者支付方式本身不支持该地区…

Python使用matplotlib计算并绘制图像的直方图

除了使用OpenCV计算图像直方图外&#xff0c;matplotlib也提供了直方图计算并绘制功能&#xff0c;只需要把图像&#xff08;或对应通道&#xff09;作为参数输入&#xff0c;即可通过matplotlib输出直方图&#xff08;标准直方图&#xff0c;非条形图表达&#xff09;&#xf…

LVS负载均衡群集-DR模式

一、负载均衡群集 1.数据包流向分析 客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。Director Server 和 Real Server 在同一个网络中&#xff0c;数据通过…

MKS MWH-5匹配器Automatc matching impedance Network手侧

MKS MWH-5匹配器Automatc matching impedance Network手侧

Golang基础语法学习与速成

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 目录 1.golang介绍 1.1介绍 1.2优势 2.语法 2.1控制台输出 2.2算术运算符 2.3变量常量 2.4for循环 2.5if语句 2.6switch语句 2.7作用域 2.8浮点数和零值 2.8.1浮点数 2.8.2零值 2.9格式化…