0726,没什么用的SELECT和没用的我

news2024/9/20 22:32:44

目录

select 可恶!!!

一对多聊天室  select:(抄抄抄

最怕人类开始思考

补一对一的 select  喵:(抄抄抄 

??今天就这么结束了???

bit -->  type  -->  kilobite
     8         1024

select 可恶!!!

//select 

fd_set  //位图数组

void FD_CLR(int fd,fd_set *set);
int FD_ISSET(int fd,fd_set* set);  //检查文件描述符 fd 是否在 set 中设置
void FD_SET(int fd,fd_set* set)    //将文件描述符 fd 加入到 set 中,以便将其监视
void FD_ZERO(fd_set * set)

int select (int nfds,fd_set *readfd,fd_set* writefds,fd_set *exceptfds,
struct timeval *timeout);
___(maxfd+1,num/NULL,num/NULL,num/NULL,NULL(无限制等待));
一对多聊天室  select:(抄抄抄
//sel_kai.c
#include <func.h>
#define IP1  "192.168.235.128"
#define PORT1 8080

int main()
{
    struct sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port=htons(PORT1);
    addr.sin_addr.s_addr=inet_addr(IP1);

    int listener=socket(AF_INET,SOCK_STREAM,0);
    int ret=bind(listener,(struct sockaddr*)&addr,sizeof(struct sockaddr));
    if(ret==-1){error(1,errno,"bind");}
    ret=listen(listener,100);

    int ac_fd[100];
    int ac_num=0;   //xuyao监听的文件描述符数量
    char buff[256];
    char buff_sent[256];

    fd_set readfds;  //监听集合
    FD_ZERO(&readfds);
    FD_SET(listener,&readfds);  //listener加入监听
    int fd_max=listener;       //监听的最大文件描述符
    fd_set old_fds=readfds;   //要监听的文件描述符(专一!!!)
    printf("Listening\n");

    while(1){
        readfds=old_fds;
        select(fd_max+1,&readfds,NULL,NULL,NULL);
        if(FD_ISSET(listener,&readfds)){
            ac_fd[ac_num]=accept(listener,NULL,NULL);
            FD_SET(ac_fd[ac_num],&old_fds);
            if(ac_fd[ac_num]>fd_max){
                fd_max=ac_fd[ac_num];
            }
            ac_num++;
            printf("wellcome user:%d,\n",ac_fd[ac_num-1]);
        }
        for(int i=0;i<ac_num;i++){
            if(FD_ISSET(ac_fd[i],&readfds)){
                int a=recv(ac_fd[i],buff,256,0);
                if(a==0){close(ac_fd[i]);}
            sprintf(buff_sent,"user%d:%s",ac_fd[i],buff);
            for(int j=0;j<ac_num;j++){
                send(ac_fd[j],buff_sent,strlen(buff_sent)+1,0);
            }
            }
        }
    }
    return 0;
}

//sel_kai_c.c
#include <func.h>
#define PORT1 8080
#define IP1  "192.168.235.128"

int main()
{
    struct sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port=htons(PORT1);
    addr.sin_addr.s_addr=inet_addr(IP1);

    int fd=socket(AF_INET,SOCK_STREAM,0);
    int ret=connect(fd,(struct sockaddr*)&addr,sizeof(struct sockaddr));
    if(ret==-1){error(1,errno,"bind");}

    fd_set readfds;
    fd_set old_fds;
    int fd_max;

    FD_ZERO(&readfds);
    fd_max=STDIN_FILENO;
    FD_SET(fd,&readfds);
    if(fd_max<fd){fd_max=fd;}

    char buff[256];
    old_fds=readfds;

    while(1){
        readfds=old_fds;
        select(fd_max+1,&readfds,NULL,NULL,NULL);
        if(FD_ISSET(STDIN_FILENO,&readfds)){
            fgets(buff,256,stdin);
            send(fd,buff,strlen(buff)+1,0);
        }
        if(FD_ISSET(fd,&readfds)){
            int n=recv(fd,buff,256,0);
            if(n==0){error(1,errno,"connect break");}
            printf("%s\n",buff);
        }
    }

    return 0;
}

牛逼极了但是我十分迷惑,应该是有输出的吧???但是没跑出来喵

最怕人类开始思考
————————————————client.c
✗  46 ---addr          
   47 socket  connect  (fd) 
   48                  
   49 readfds  old_fds   fd_max  buff[]
   50                  
   51 FD_SET(fd,&readfds);
✗  52 while(1){        
   53         readfds=old_fds;
   54         select(fd_max+1,&readfds,NULL,NULL,NULL);
   55         if(FD_ISSET(STDIN_FILENO,&readfds)){
   56             fgets; send;
   57         }//stdin是否有读入
   58         if(FD_ISSET(fd,&readfds)){
   59             recv; printf;
   60         }//fd是否有传输
   61 
   62 }   

————————————————server.c
✗  57 --addr
   58 socket --> bind --> listen  (listener)
   59 
   60 --ac_fd[]          ac_num         buff[] buff_sent[]
   61 已连接描述符集合   当前监听数量   缓冲数组                                
   62 --readfds         old_fds            fd_max
   63 需要监听的fd    初始需要监听的fd   最大的fd
   64 
   65 FD_SET(listener,&readfds);
✗  66 while(1){
   67         readfds=old_fds;
   68         select    //监视文件描述符中套接字的变化
   69         if(FD_ISSET(listener,&readfds)){
   70             accept --> FD_SET  //接收,设置监视
✗  71             (ac_fd[]  ac_num  fd_max  old_fds) //更新信息
   72         }//开哥!说,有新链接来的时候就是,listener的读缓冲区
   73          //有东西喵,监听到读事件发生???就不阻塞了
   74          //我怎么一分钟过去就又迷惑了,好好好,不敢冒头了
   75         for(int i=0;i<ac_num;i++){
   76             if(FD_ISSET(ac_fd[i],&readfds)){
   77                 recv,if (recv)==0--close,buff[]-->buff_sent[]
   78             }//接收,根据字符数目判断是否断开               
   79             for(int j=0;j<ac_num;j++){
   80                 send(buff_sent[])
   81             }
   82         }
   83 }

/*
想起来了喵,bind是 addr & fd  绑定
要把服务器的端口(addr)暴露给客户端,但是客户端的端口是随机分配的
绑定之后,addr就可以通过fd接收数据了,所以!!!
 if(FD_ISSET(listener,&readfds))
*/
聪明小辉聪明小辉聪明小辉聪明小辉聪明小辉聪明小辉聪明小辉聪明小辉聪明小辉聪明小辉聪明小辉
补一对一的 select  喵:(抄抄抄 
————————————————client.c
--addr
socket --> connect   (clientfd)

--rdset buff[]

while(1){
FD_SET(clientfd,&rdset)
FD_SET(STDIN_FILENO,&rdset)
select

if(FD_ISEET(STDIN_FILENO,&rdset))
{ read; send; }
if(FD_ISEET(clientfd,&rdset))
{ recv; printf; }

}

close


————————————————server.c     //我猜的,好像没抄过一对一的服务器,问题不大
--addr
socket --> bind -->  listen   (fd)

--rdset buff[]

if(FD_ISEET(STDIN_FILENO,&rdset))
{ read; send; }
if(FD_ISEET(fd,&rdset))
{ recv; printf; }

}

close

??今天就这么结束了????

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

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

相关文章

全能Ai助手:写作到设计,宝藏神器帮你事半功倍

今天&#xff0c;就让我们一起踏上这场寻找“隐藏”宝藏的旅程&#xff0c;探索这些AI工具如何改变我们的生活&#xff01; 一、高效生产力的提升之道 1. 文案创作助手 案例&#xff1a;某位自媒体博主使用了一款智能写作工具&#xff0c;不仅大大节省了写作时间&#xff0c;…

JMeter接口测试:测试中奖概率!

介绍 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具&#xff0c;用于对软件做压力测试。JMeter 最初被设计用于 Web 应用测试&#xff0c;但后来扩展到了其他测试领域&#xff0c;可用于测试静态和动态资源&#xff0c;如静态文件、Java 小服务程序、CGI 脚本、J…

c语言第四天笔记

关于 混合操作&#xff0c;不同计算结果推理 第一种编译结果&#xff1a; int i 5; int sum (i) (i) 6 7 13 第二种编译结果&#xff1a; int i 5; int sum (i) (i) 6 7 7 7 前面的7是因为后面i的变化被影响后&#xff0c;重新赋值 14 第一种编译结果&#xff…

Llama + Dify,在你的电脑搭建一套AI工作流

theme: smartblue 点赞 关注 收藏 学会了 本文简介 最近字节在推Coze&#xff0c;你可以在这个平台制作知识库、制作工作流&#xff0c;生成一个具有特定领域知识的智能体。 那么&#xff0c;有没有可能在本地也部署一套这个东西呢&#xff1f;这样敏感数据就不会泄露了&…

Redis的两种持久化方式---RDB、AOF

rdb其实就是一种快照持久化的方式&#xff0c;它会将Redis在某个时间点的所有的数据状态以二进制的方式保存到硬盘上的文件当中&#xff0c;它相对于aof文件会小很多&#xff0c;因为知识某个时间点的数据&#xff0c;当然&#xff0c;这就会导致它的实时性不够高&#xff0c;如…

Scrapy 爬取旅游景点相关数据(三)

这一节我们将之前爬取到的景点数据进行解析&#xff0c;并且保存为excel&#xff0c;便于后续使用&#xff0c;本节包含 &#xff08;1&#xff09; 景点数据解析 &#xff08;2&#xff09;数据保存到excel 1 编写爬虫 这次继续改进第二节的爬虫&#xff0c;新建一个爬虫文…

C#如何引用dll动态链接库文件的注释

1、dll动态库文件项目生成属性中要勾选“XML文档文件” 注意&#xff1a;XML文件的名字切勿修改。 2、添加引用时XML文件要与DLL文件在同一个目录下。 3、如果要是添加引用的时候XML不在相同目录下&#xff0c;之后又将XML文件复制到相同的目录下&#xff0c;需要删除引用&am…

蓝桥强化宝典(3)BFS

一、定义 广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;是另一种用于遍历或搜索树或图的算法。与深度优先搜索&#xff08;DFS&#xff09;沿着树的深度遍历不同&#xff0c;广度优先搜索会逐层遍历图的顶点。它从一个指定的源顶点开始&#xff0c;首先访问这…

失业潮下,有人靠天工AI做副业年入10万?

前言 你好&#xff0c;我是咪咪酱 这篇文章总结2个AI副业项目&#xff0c;不用写代码&#xff0c;就能做的2个副业项目。 第一&#xff1a;AI生成微信表情包&#xff0c;上传到微信表情包平台等&#xff0c;坚持下去&#xff0c;会有可观的收入。 第二&#xff1a;AI生成连载…

Java 8 中 20 个高频面试题及答案

文章目录 前言20 道高频题问题 1&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出列表中所有的偶数&#xff1f;问题 2&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出所有以 1 开头的数字&#xff1f;问题 3&#xff1a;如何使用 Stream 函数在给…

1.ESP32-CAM 下使用 ESP-IDF 打开摄像头

主要资料&#xff1a; 乐鑫官方编程指南 ESP-IDF 编程指南安信可官方模块页 安信可-ESP32-CAM摄像头开发板官方使用教程 安信可ESP32-CAM摄像头开发demo–局域网拍照、实时视频、人脸识别 &#xff08;开发环境是Linux&#xff09; 本文目标是在 Windows 下跑通摄像头 hello …

国衍科技——RFID技术的应用

在文物馆藏信息的记录与管理过程中&#xff0c;准确性和详细性是至关重要的。无论是大型博物馆还是私人收藏馆&#xff0c;都需要有效的方法来确保馆藏文物信息的可追溯性和可访问性&#xff0c;才能提供更好的服务和保护馆藏资源。而结合射频识别&#xff08;RFID&#xff09;…

2-46 基于matlab的声音信号的短时能量、短时过零率、端点检测

基于matlab的声音信号的短时能量、短时过零率、端点检测。通过计算计算短时能量、调整能量门限&#xff0c;然后开始端点检测。输出可视化结果。程序已调通&#xff0c;可直接运行。 2-46 短时能量 短时过零率 端点检测 - 小红书 (xiaohongshu.com)

未来的智能农业:智能合约如何提升农业生产效率和可持续性

随着全球人口的增长和资源的有限性&#xff0c;农业生产面临着越来越大的挑战。如何在提高生产效率的同时保障可持续发展成为全球农业发展的关键问题。智能合约作为一种基于区块链技术的自动化执行合约&#xff0c;正在逐渐应用于农业领域&#xff0c;为农业生产带来了新的机遇…

【MATLAB源码-第238期】基于simulink的三输出单端反激flyback仿真,通过PWM和PID控制能够得到稳定电压。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 概述 反激变换器是一种广泛应用于电源管理的拓扑结构&#xff0c;特别是在需要隔离输入和输出的应用中。它的工作原理是利用变压器的储能和释放能量来实现电压转换和隔离。该图展示了一个通过脉宽调制&#xff08;PWM&#…

C++——QT:保姆级教程,从下载到安装到用QT写出第一个程序

登录官网&#xff0c;在官网选择合适的qt版本进行下载 这里选择5.12.9版本 点击exe文件下载&#xff0c;因为服务器在国外&#xff0c;国内不支持&#xff0c;所以可以从我的网盘下载 链接: https://pan.baidu.com/s/1XMILFS1uHTenH3mH_VlPLw 提取码: 1567 --来自百度网盘超级…

git merge VS git rebase VS git cherry-pick

git merge VS git rebase VS git cherry-pick 在Git中&#xff0c;git merge、git rebase和git cherry-pick都是用于整合不同分支中的更改到当前分支的命令。它们各有特点和适用场景。 Git Merge git merge 是一种将一个分支的更改合并到另一个分支的方法。它创建一个新的提…

用Postman Flows打造你的专属API:外部公开,轻松上手!

引言 Postman Flows 是一个使用 GUI 进行无代码 API 调用流程创建的服务。这篇文章我尝试使用 Flows 来构建将 Momento Topic 中的数据保存到 TiDB 的保存 API&#xff0c;因此想分享一些使用过程中的技巧等。 实现内容 将从 Momento Topics 配发的 JSON 数据保存到 TiDB 中。…