首页 > 其他分享 >select()API

select()API

时间:2024-06-13 21:46:21浏览次数:25  
标签:int readfds API sockfd 接字 select 客户端

编写TCP客户端和服务端程序,客户端通过多路IO复用同时处理标准输入(文件描述符为0)和套接字。当输入为quit时程序结束;当通过套接字收到对方消息时把收到的消息再次转发给对方,服务器端需通过select()监控listenfd和accept()后建立的新的套接字newfd, 可只写select()相关的主要代码。


        perror("listen");
        return -1;
    }
     //接受连接--accept阻塞
    //接收客户端数据--recv阻塞
     //select多路复用
     fd_set readfds;
     //定义读文件描述符集合
    int  cfds[50]={0};
     //保存所有客户端的套接字
    while(1)
    {
        int maxfd = sockfd;
        //清空集合
        FD_ZERO(&readfds);
        FD_SET(sockfd,&readfds);
          //把sockfd添加到readfds集合中
          //把客户端的套接字也添加到集合中
        for(int i=0; i<50; i++)
        {
              if(cfds[i] != 0)//如果不等于0就说明这个空间存储了套接字 
           {
                FD_SET(cfds[i],&readfds);
                maxfd = maxfd>cfds[i]?maxfd:cfds[i];
            }
        }        //select用监听readfds里面的所有文件描述符,
        //如果某一个或多个描述符有响应就跳出select函数
        ret = select(maxfd+1,&readfds,NULL, NULL, NULL);
        if(ret < 0)
        {
            perror("select");
        }
        //判断是否是sockfd有数据---说明有客户端连接
        if(FD_ISSET(sockfd, &readfds))
        { 
               //接受连接
            int clientfd = accept(sockfd, NULL,NULL);
            if(clientfd < 0)
            {
                perror("accept");
            }            //把客户端套接字保存到cfds数组中
            for(int i=0; i<50; i++)
            {
                if(cfds[i] == 0)//判断放在没有使用的空间中
                {
                     cfds[i] = clientfd;
                     break;
                }
            }
         }        //判断是否是客户端有数据
        for(int i=0; i<50; i++)
        {
            //判断套接字是否存在,并且是否有数据到达
            if(cfds[i] != 0 && FD_ISSET(cfds[i], &readfds))
            { 
                     //接收客户端数据
                char buffer[128]={0};
                int size = recv(cfds[i], buffer, 128, 0);
                if(size<=0)
                {
                    printf("有客户端掉线\n");
                    close(cfds[i]);
                    cfds[i] = 0;
                }
                //把接收到的信息转发给客户端自己
                     size = send(cfds[i],buffer,size,0);

            }
        }
    }
     printf("有客户端连接\n");
    close(sockfd);
 }

标签:int,readfds,API,sockfd,接字,select,客户端
From: https://www.cnblogs.com/hhail08/p/18246795

相关文章

  • FastAPI-9 服务层
    9服务层本章阐述了服务层,即中间层。9.1定义服务服务层是网站的核心,它接收来自多个来源的请求,访问作为网站DNA的数据,并返回响应。常见的服务模式包括以下组合:创建/检索/更改(部分或全部)/删除一件事/多件事在RESTful路由器层,名词是资源。在本书中,我们的资源最初将包括隐......
  • 6.13API接口服务类漏洞探针
    ip地址解析:www.x.x.x.com,对应网站目录为d:/wwwroot/xiaodi/而127.x.x.x,对应网站目录为d:/wwwroot/,可能存在网站备份文件zip,所以ip网址端口都的扫描;协议端弱口令爆破:超级弱口令检查工具;端口服务安全问题(用于无思路时)思路:利用探针对端口探测后,对口令安全、Web漏洞、中间......
  • java:【@Import】和【ImportSelector】的简单示例
    #代码结构#项目【myBeanBranch】【pom.xml】<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.15.RELEASE</version></dependency><dependency>......
  • 【第5章】Vue之API风格
    文章目录前言一、选项式API(OptionsAPI)1.代码2.效果二、组合式API(CompositionAPI)1.代码2.效果三、两者之间的区别总结前言Vue.js提供了两种主要的API风格来组织组件的代码:选项式API(OptionsAPI)和组合式API(CompositionAPI)。这两种API风格在Vue3......
  • FastAPI-7:框架比较(Flask、Django及FastAPI)
    7框架比较(Flask、Django及FastAPI)关于一个新的Web框架,您可能想知道的第一件事就是如何入门,而一种自上而下的方法就是定义路由(从URL和HTTP方法到函数的映射)。7.1FlaskFlask自称是微框架。它提供基本功能,你可以根据需要下载第三方软件包进行补充。它比Django小,入门时学习......
  • 1688跨境是淘系对抗拼多多Temu的一把尖刀吗?|1688开放API接口接入|1688跨境代采系统搭
    1688跨境是淘系对抗拼多多Temu的一把尖刀,这一观点在电商领域内有一定的支持。1688作为阿里巴巴集团旗下的重要电商平台,长期以来专注于B2B业务,连接着大量的制造商和采购商。随着电商平台竞争的加剧,1688也在不断地进行战略调整和业务升级,尤其是在跨境电商领域的动作频频,显示出其......
  • 智能小程序 Ray 开发设备信息 API 集合(一)
    getDeviceNumWithDpCode根据dpCode获取群组下具备此dpCode的设备数量。如果是一个分享的群组,请通过接口获取。引入import{device}from'@ray-js/ray';const{getDeviceNumWithDpCode}=device;需引入DeviceKit,且在>=2.4.0版本才可使用请求参数Objectobjec......
  • apisix问题记录
    负载均衡可以给restapi(9080)做负载均衡不可以给dashboard做负载均衡,否则会出现闪退,dashboard之间的token并不是通用的路由导出openapi路由导出openapi,备份丢失的时候,可以直接导入数据,丢失的上游数据在新导入的路由里会变成手动数据,路由信息里,http方法已选项会丢失options请......
  • [1007] Getting Started with PDF Extract API (Python)
    ref:GettingStartedwithPDFExtractAPI(Python)Inthiscase,IplantousethemethodofcompressingPDFtoshrinkthesizeofsomePDFfiles.ButthismethodfromtheAdobeAcrobatAPIdoesn'tworkverywellcomparedthetoolwithintheAdobe......
  • Stream API用好了效率倍增,优缺点对比
    https://mp.weixin.qq.com/s/Oc-WpS2hdMgPtHWuhwgzCw 既然JDK的大神们,设计出StreamAPI,肯定是优点大于缺点,程序汪必须拥抱变化,下面我列出了他的优缺点,后面还有常见函数的例子。优点:代码简洁:StreamAPI使用Lambda表达式,使得集合操作的代码更加简洁易读,减少了传统的for循环......