复习 --- select并发服务器
selectIO多路复用并发服务器,是通过轮询检测文件描述符来实现并发
将内核要检测文件描述符放入集合中,调用select函数,通知内核区检测文件描述符集合中的文件描述符是否准备就绪,即对应的空间中是否有数据
对准备就绪的文件描述符指向对应的IO操作,让再循环通过select监测
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>#define ERR_MSG(msg) do{\fprintf(stderr, "line:%d ", __LINE__);\perror(msg);\
}while(0)#define IP "192.168.114.134" //本机IP ifconfig
#define PORT 8899 //1024-49151int main(int argc, const char *argv[])
{//创建流式套接字int sfd = socket(PF_INET, SOCK_STREAM, 0);if(sfd < 0){ERR_MSG("socket");return -1;}printf("sfd = %d\n", sfd);//允许端口快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}printf("允许端口快速重用成功\n");//填充地址信息结构体,//真实的地址信息结构体根据地址族指定 AF_INET:man 7 ipstruct sockaddr_in sin;sin.sin_family = AF_INET; //必须填AF_INET;sin.sin_port = htons(PORT) ; //端口号,1024~49151sin.sin_addr.s_addr = inet_addr(IP); //本机IP, ifconfig//将IP和端口绑定到套接字上;if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0){ERR_MSG("bind");return -1;}printf("bind success __%d__\n", __LINE__);//将套接字设置为被动监听状态,监听是否有客户端连接成功;if(listen(sfd, 128) < 0){ERR_MSG("listen");return -1;}printf("listen success __%d__\n", __LINE__);//创建select队列结构体fd_set readfds , tempfds;FD_ZERO(&readfds);FD_SET(sfd,&readfds);FD_SET(0,&readfds);int maxfd = sfd;int sel = 0;struct sockaddr_in cin; //存储连接成功的客户端地址信息socklen_t addrlen = sizeof(cin);char buf[1024] = "";ssize_t res = 0; //读取到的个数//用来存储对应用户的地址信息结构体struct sockaddr_in client_arr[1020];//循环监听文件描述符是否启动while (1){tempfds = readfds;sel = select(maxfd+1,&tempfds,NULL,NULL,NULL);if(sel<0){ERR_MSG("select");return -1;}else if (sel == 0){printf("超时\n");return -1;}for (int i = 0;i<=maxfd;i++){if (FD_ISSET(i,&tempfds)){if (i == 0){int send_fd = -1; //要发给那个用户对应的文件描述符int res_sc = 0;printf("终端有数据写入\n"); //不将缓存区中的内容取出//select会一直监听到该文件描述准备就绪res_sc = scanf("%d %s",&send_fd,buf);if (res_sc < 2){fprintf(stderr,"请输入正确的格式(int string )\n");continue;}if (send_fd < sfd || send_fd > 1024 || FD_ISSET(send_fd,&readfds)){fprintf(stderr,"文件描述符错误\n");continue;}if(send(send_fd,buf,sizeof(buf), 0) < 0){ERR_MSG("send");return -1;}}else if (sfd == i){//阻塞函数,从已完成连接的队列头中获取一个客户端信息,生成一个新的文件描述符,//该文件描述符才是与客户端通信的文件描述符!!!int newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen);if(newfd < 0){ERR_MSG("accept");return -1;}printf("[%s:%d] newfd=%d 连接成功__%d__\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd, __LINE__);client_arr[newfd-4] = cin;FD_SET(newfd,&readfds);maxfd = maxfd>newfd?maxfd:newfd;}else{bzero(buf, sizeof(buf));//接收res = recv(i, buf, sizeof(buf), 0);if(res < 0){ERR_MSG("recv");return -1;}else if(0 == res){printf("[%s:%d] newfd=%d 客户端下线__%d__\n", \inet_ntoa(client_arr[i-4].sin_addr), ntohs(client_arr[i-4].sin_port), i, __LINE__);close(i);FD_CLR(i,&readfds);maxfd = maxfd==i?maxfd-1:maxfd;continue;}printf("[%s:%d] newfd=%d : %s __%d__\n", \inet_ntoa(client_arr[i-4].sin_addr), ntohs(client_arr[i-4].sin_port), i, buf, __LINE__);strcpy(buf,"收到");if(send(i, buf, strlen(buf), 0) < 0){ERR_MSG("send");return -1;}printf("发送成功\n");}}}}/*while(1){bzero(buf, sizeof(buf));bzero(send_b, sizeof(send_b));//接收res = recv(newfd, buf, sizeof(buf), 0);if(res < 0){ERR_MSG("recv");return -1;}else if(0 == res){printf("[%s:%d] newfd=%d 客户端下线__%d__\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd, __LINE__);break;}printf("[%s:%d] newfd=%d : %s __%d__\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd, buf, __LINE__);//发送 将数据拼接字符串后发送回去fprintf(stdout,"回答的内容(不要超过1024字节)>>");fscanf(stdin,"%s",send_b);if(send(newfd, send_b, sizeof(send_b), 0) < 0){ERR_MSG("send");return -1;}printf("发送成功\n");}
*/close(sfd);return 0;
}
相关文章:
复习 --- select并发服务器
selectIO多路复用并发服务器,是通过轮询检测文件描述符来实现并发 将内核要检测文件描述符放入集合中,调用select函数,通知内核区检测文件描述符集合中的文件描述符是否准备就绪,即对应的空间中是否有数据 对准备就绪的文件描述…...
程序三高的方法
程序三高的方法 目录概述需求: 设计思路实现思路分析1.1)高并发 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,c…...
全志ARM926 Melis2.0系统的开发指引⑦
全志ARM926 Melis2.0系统的开发指引⑦ 编写目的11. 调屏11.1. 调屏步骤简介11.1.1. 判断屏接口。11.1.2. 确定硬件连接。11.1.3. 配置显示部分 sys_config.fex11.1.3.1. 配置屏相关 IO 11.1.4. Lcd_panel_cfg.c 初始化文件中配置屏参数11.1.4.1. LCD_cfg_panel_info11.1.4.2. L…...
全志ARM926 Melis2.0系统的开发指引⑧
全志ARM926 Melis2.0系统的开发指引⑧ 编写目的12.5. 应用程序编写12.5.1. 简单应用编写12.5.1.1. 注册应用12.5.1.2. 创建管理窗口12.5.1.3. 实现管理窗口消息处理回调函数12.5.1.4. 创建图层12.5.1.5. 创建 framewin12.5.1.6. 实现 framewin 消息处理回调函数 -. 全志相关工具…...
区别对比表:阿里云轻量服务器和云服务器ECS对照表
阿里云轻量应用服务器和云服务器ECS区别对照表,一看就懂的适用人群、使用场景、优缺点、使用限制、计费方式、网路和镜像系统全方位对比,阿里云服务器网分享ECS和轻量应用服务器区别对照表: 目录 轻量应用服务器和云服务器ECS区别对照表 轻…...
【做题笔记】多项式/FFT/NTT
HDU1402 - A * B Problem Plus 题目链接 大数乘法是多项式的基础应用,其原理是将多项式 f ( x ) a 0 a 1 x a 2 x 2 a 3 x 3 ⋯ a n x n f(x)a_0a_1xa_2x^2a_3x^3\cdotsa_nx^n f(x)a0a1xa2x2a3x3⋯anxn中的 x 10 x10 x10,然后让大数的…...
网课搜题 小猿题库多接口微信小程序源码 自带流量主
多接口小猿题库等综合网课搜题微信小程序源码带流量主,网课搜题小程序, 可以开通流量主赚钱 搭建教程1, 微信公众平台注册自己的小程序2, 下载微信开发者工具和小程序的源码3, 上传代码到自己的小程序 源码下载:https://download.csdn.net/download/m0_…...
centos安装conda python3.10
最新版本的conda自带python3.10,直接安装即可。 手动创建一个conda文件夹,进入该文件夹,然后执行以下操作步骤。 1.下载 curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh2.安装 sh Miniconda3-latest-Linux-x86_64.…...
解密京东面试:如何应对Redis缓存穿透?
亲爱的小伙伴们,大家好!欢迎来到小米的微信公众号,今天我们要探讨一个在面试中可能会遇到的热门话题——Redis缓存穿透以及如何解决它。这个话题对于那些渴望进入技术领域的小伙伴们来说,可是必备的哦! 认识Redis缓存…...
#力扣:1. 两数之和@FDDLC
1. 两数之和 - 力扣(LeetCode) 一、Java import java.util.HashMap;class Solution {public int[] twoSum(int[] nums, int target) { //返回数组HashMap<Integer, Integer> map new HashMap<>(); //键:元素值;值&…...
【小沐学Python】各种Web服务器汇总(Python、Node.js、PHP、httpd、Nginx)
文章目录 1、Web服务器2、Python2.1 简介2.2 安装2.3 使用2.3.1 http.server(命令)2.3.2 socketserver2.3.3 flask2.3.4 fastapi 3、NodeJS3.1 简介3.2 安装3.3 使用3.3.1 http-server(命令)3.3.2 http3.3.3 express 4、PHP4.1 简…...
【AI视野·今日Robot 机器人论文速览 第四十六期】Tue, 3 Oct 2023
AI视野今日CS.Robotics 机器人学论文速览 Tue, 3 Oct 2023 Totally 76 papers 👉上期速览✈更多精彩请移步主页 Interesting: 📚Aerial Interaction with Tactile, 无人机与触觉的结合,实现空中交互与相互作用。(from CMU) website&#…...
macOS三种软件安装目录以及环境变量优先级
一、系统自带应用 这些软件(以git为例)位于根目录下的/usr/bin/xxx,又因为系统级环境变量文件/etc/paths已指定了命令查找位置: /usr/local/bin /System/Cryptexes/App/usr/bin /usr/bin /bin /usr/sbin /sbin所以这些自带应用可…...
嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动
系列文章目录 文章目录 系列文章目录前言IMX6ULL介绍主要资料IO表现形式 汇编LED驱动原理图初始化流程时钟设置IO复用设置电气属性设置使用GPIO 编写驱动编译程序编译.o文件地址链接.elf格式转换.bin反汇编(其他) 综合成Makefile完成一步编译烧录程序imx…...
企业微信机器人对接GPT
现在网上大部分微信机器人项目都是基于个人微信实现的,常见的类库都是模拟网页版微信接口。 个人微信作为我们自己日常使用的工具,也用于支付场景,很怕因为违规而被封。这时,可以使用我们的企业微信机器人,利用企业微信…...
【数据结构】排序(1) ——插入排序 希尔排序
目录 一. 直接插入排序 基本思想 代码实现 时间和空间复杂度 稳定性 二. 希尔排序 基本思想 代码实现 时间和空间复杂度 稳定性 一. 直接插入排序 基本思想 把待排序的记录按其关键码值的大小依次插入到一个已经排好序的有序序列中,直到所有的记录插入完为止&…...
Python 列表推导式深入解析
Python 列表推导式深入解析 列表推导式是 Python 中的一种简洁、易读的方式,用于创建列表。它基于一个现有的迭代器(如列表、元组、集合等)来生成新的列表。 基本语法: 列表推导式的基本形式如下: [expression for…...
信息学奥赛一本通-编程启蒙3103:练18.3 组别判断
3103:练18.3 组别判断 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 1963 通过数: 1418 【题目描述】 信息学课上要同学分组做期末报告,分组的方式为依座号顺序,每 3个人一组。如:1, 2, 3 为第一组,4, …...
C++ primer plus--探讨 C++ 新标准
18 探讨 C 新标准 18.1 复习前面介绍过的 C11 功能 (1)C11 扩大了列表初始化的适用范围,使用初始化列表时,可以不加等号。 int x {5}; float y {1.1}; short arr[5] {1, 2, 3, 4, 5}; int* ar new int[4] {1, 2, 3, 4}; vect…...
2023版 STM32实战6 输出比较(PWM)包含F407/F103方式
输出比较简介和特性 -1-只有通用/高级定时器才能输出PWM -2-占空比就是高电平所占的比例 -3-输出比较就是输出不同占空比的信号 工作方式说明 -1-1- PWM工作模式 -1-2- 有效/无效电平 有效电平可以设置为高或低电平,是自己配置的 周期选择与计算 周期重…...
选择排序算法:简单但有效的排序方法
在计算机科学中,排序算法是基础且重要的主题之一。选择排序(Selection Sort)是其中一个简单但非常有用的排序算法。本文将详细介绍选择排序的原理和步骤,并提供Java语言的实现示例。 选择排序的原理 选择排序的核心思想是不断地从…...
安卓教材学习
文章目录 教材学习第一行代码 Android 第3版环境配置gradle配置下载包出现问题 教材学习 摘要:选了几本教材《第一行代码 Android 第3版》,记录一下跑案例遇到的问题,和总结一些内容。 第一行代码 Android 第3版 环境配置 gradle配置 gradl…...
C++设计模式-生成器(Builder)
目录 C设计模式-生成器(Builder) 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-生成器(Builder) 一、意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 二、…...
CTFHUB - SSRF
目录 SSRF漏洞 攻击对象 攻击形式 产生漏洞的函数 file_get_contents() fsockopen() curl_exec() 提高危害 利用的伪协议 file dict gopher 内网访问 伪协议读取文件 端口扫描 POST请求 总结 上传文件 总结 FastCGI协议 CGI和FastCGI的区别 FastCGI协议 …...
边缘计算网关
一、项目整体框架图 二、项目整体描述 边缘计算网关项目主要实现了智能家居场景和工业物联网场景下设备的数据采集和控制。 整个项目分为三大层:用户接口层、网关层、设备层。 其中用户层通过QT客户端、WEB界面及阿里云提供数据展示和用户接口。 网关使用虚拟机代替…...
1800_vim的宏录制功能尝试
全部学习信息汇总: GreyZhang/editors_skills: Summary for some common editor skills I used. (github.com) 最近5年多来,我emacs的编辑器用的还是比较多的。我的配置基本上是一个spacemacs,然后根据自己的需求增加了一丁点儿的其他配置。而…...
Ultra-Fast-Lane-Detection-v2 {后处理优化}//参考
采用三次多项式拟合生成的anchor特征点,在给定的polyfit_draw函数中,degree参数代表了拟合多项式的度数。 具体来说,当我们使用np.polyfit函数进行数据点的多项式拟合时,我们需要指定一个度数。这个度数决定了多项式的复杂度。例…...
【面试题精讲】Java静态方法和实例方法有何不同?
★ 有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top ” 首发博客地址[1] 面试题手册[2] 系列文章地址[3] Java 中的静态方法和实例方法在使用和行为上有一些不同之处。 调用方式不同: 静…...
【数据结构】布隆过滤器
布隆过滤器的提出 在注册账号设置昵称的时候,为了保证每个用户昵称的唯一性,系统必须检测你输入的昵称是否被使用过,这本质就是一个key的模型,我们只需要判断这个昵称被用过,还是没被用过。 方法一:用红黑…...
linux基础4---内存
1、什么是内存泄漏,怎么解决内存泄漏? 在嵌入式Linux中,内存泄漏是指由于疏忽或错误,导致一些对象或资源无法被垃圾回收器回收,从而导致内存占用不断增加,最终导致设备性能下降。内存泄漏对程序的影响很大,可能会导致应用程序变慢、崩溃或者消耗大量的内存,最终导致设…...
做网站导航栏目怎么做/职业技能培训网
这道题是LeetCode里的第937道题。 题目描述: 你有一个日志数组 logs。每条日志都是以空格分隔的字串。 对于每条日志,其第一个字为字母数字标识符。然后,要么: 标识符后面的每个字将仅由小写字母组成,或;标…...
麦包包的网站建设分析/怎么查询搜索关键词
学东西都是从例子开始是最好的,从hadoop的一个简单的mapreduce作业开始import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritabl…...
做网站app需要懂些什么软件/北京今日重大新闻
2019独角兽企业重金招聘Python工程师标准>>> 作为一个体重超标,工作量超标的程序员,我的腰对我呐喊了,很麻溜的突出了, 0x0001 14年的4月份的时候,我天天加班,然后有天发现腰部酸痛,…...
湖南网站建设推广/百度收录软件
这里是对快速排序算法的一个简介,适合初学者。写在这里也是加深自己的印象,同时供学习交流。 1,我下面先对快速排序算法的过程做一个简单图形化介绍这样大家就会对后面的程序有个更清晰的认识。 排序问题如下: 问题描述ÿ…...
wordpress 做分销/宁波企业seo外包
FreeRTOS任务删除 在实时操作系统中,通过将每个应用程序划分为有用的任务来实现多任务处理。 但并不是所有的任务都会在程序的整个执行过程中执行。 有些任务比其他任务更重要并且执行得更频繁。 因此,在RTOS中,有些任务可以在程序执行过程中,在近期不需要调用或者程序中不…...
桂林市网站建设/百度电脑版官方下载
ajax成功狗延迟2秒跳转jQuery代码段将AJAX调用延迟X秒。 可用于需要通过AJAX从服务器端获取数据之前需要采取措施的事件。 更新:通过使用setTimeout()函数,有一种更简单的方法可以执行此操作–参见以下示例。 请享用!…...