服务器连接多客户端
一、epoll 核心函数详解
1. epoll_create
/epoll_create1
- 创建 epoll 实例
c
#include <sys/epoll.h>
int epoll_create(int size); // Linux 2.6.8前需指定size(>=1),后续版本可忽略
int epoll_create1(int flags); // 推荐使用,支持flags参数
- 功能:创建一个 epoll 实例,返回文件描述符(epfd),用于管理监视的文件描述符。
- 参数:
size
:旧版本需指定预分配大小(无实际作用,可设为 1)。flags
:0
:与epoll_create
功能相同。EPOLL_CLOEXEC
:使 epfd 在进程 fork 时自动关闭。
- 返回值:成功返回 epfd(非负整数),失败返回
-1
并置errno
。 - 示例:
c
int epfd = epoll_create1(EPOLL_CLOEXEC); // 创建带自动关闭功能的epoll实例
2. epoll_ctl
- 管理监视列表
c
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
- 功能:向 epoll 实例中添加、修改或删除监视的文件描述符及其事件。
- 参数:
epfd
:epoll 实例的文件描述符。op
:操作类型:EPOLL_CTL_ADD
:添加文件描述符fd
到监视列表。EPOLL_CTL_MOD
:修改fd
关联的事件。EPOLL_CTL_DEL
:从监视列表删除fd
(event
参数可置NULL
)。
fd
:需操作的文件描述符(如套接字)。event
:指向epoll_event
结构体的指针,包含监视事件和用户数据:c
struct epoll_event {uint32_t events; // 监视事件(如EPOLLIN、EPOLLOUT、EPOLLET)epoll_data_t data; // 用户数据(如fd、指针等) }; typedef union epoll_data {void *ptr; // 自定义指针int fd; // 监视的文件描述符uint32_t u32; // 32位整数uint64_t u64; // 64位整数 } epoll_data_t;
- 返回值:成功返回
0
,失败返回-1
并置errno
。 - 示例:
c
struct epoll_event event; event.events = EPOLLIN | EPOLLET; // 边缘触发模式 + 读事件 event.data.fd = sockfd; epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &event); // 添加套接字到监视列表
3. epoll_wait
- 等待事件触发
c
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
- 功能:阻塞等待 epoll 实例中监视的文件描述符触发事件,返回激活的事件列表。
- 参数:
epfd
:epoll 实例的文件描述符。events
:用于存储激活事件的结构体数组。maxevents
:events
数组的最大长度(需小于等于创建时的预分配值)。timeout
:超时时间(ms):-1
:永久阻塞,直到事件触发。0
:非阻塞,立即返回。>0
:超时时间,到期后返回。
- 返回值:
>0
:激活的事件数量(events
中有效元素个数)。0
:超时且无事件触发。-1
:失败并置errno
。
- 示例:
c
struct epoll_event events[1024]; int n = epoll_wait(epfd, events, sizeof(events)/sizeof(events[0]), -1); // 永久阻塞等待事件 for (int i = 0; i < n; i++) {int fd = events[i].data.fd;// 处理事件... }
二、epoll 工作原理
- 数据结构:
- 监视列表:使用红黑树存储所有监视的文件描述符,支持快速增删改查(时间复杂度 O (logN))。
- 激活列表:使用链表或动态数组存储当前触发事件的文件描述符,避免遍历整个红黑树。
- 事件触发流程:
- 通过
epoll_ctl
将文件描述符添加到红黑树(监视列表)。 - 内核监听文件描述符状态,当事件(如可读、可写)发生时,将其加入激活列表。
epoll_wait
返回激活列表中的事件,用户空间处理后,激活列表清空。
- 通过
三、LT(水平触发)与 ET(边缘触发)模式对比
特性 | LT(水平触发) | ET(边缘触发) |
---|---|---|
触发条件 | 只要内核缓冲区有数据未读 / 未写,就持续触发事件。 | 仅在状态变化时触发一次事件(如数据从无到有)。 |
读操作 | 允许分多次读取,剩余数据会再次触发事件。 | 必须一次性读完所有数据(需配合非阻塞 I/O),否则剩余数据不再触发。 |
写操作 | 只要内核缓冲区有空间,就持续触发可写事件。 | 仅在缓冲区由满变空时触发一次可写事件。 |
编程复杂度 | 低,类似 select/poll,无需处理非阻塞。 | 高,必须使用非阻塞 I/O,避免阻塞导致事件丢失。 |
适用场景 | 简单场景、低速设备或不确定数据量的场景。 | 高并发、高速数据传输场景(如 Web 服务器、实时通信)。 |
- 示例配置:
c
// LT模式(默认,无需指定EPOLLET) event.events = EPOLLIN; // ET模式(需显式指定EPOLLET) event.events = EPOLLIN | EPOLLET;
四、select/poll/epoll 对比(面试重点)
特性 | select | poll | epoll |
---|---|---|---|
数据结构 | 位图(数组),最大连接数受限于FD_SETSIZE (默认 1024)。 | 结构体数组,理论无连接数限制(仅受内存限制)。 | 红黑树 + 激活列表,支持上万级连接(如 10,000+)。 |
内核遍历方式 | 每次调用遍历所有监视的文件描述符(O (n))。 | 每次调用遍历所有监视的文件描述符(O (n))。 | 仅遍历激活列表中的文件描述符(O (1)~O (k),k 为激活数)。 |
用户态 / 内核态数据拷贝 | 每次select 需拷贝全量文件描述符到内核。 | 每次poll 需拷贝全量文件描述符到内核。 | 仅在epoll_ctl 时更新红黑树,epoll_wait 无需拷贝。 |
触发模式 | 仅支持 LT 模式。 | 仅支持 LT 模式。 | 支持 LT 和 ET 模式。 |
跨平台性 | 支持(Linux/Windows/macOS)。 | 支持(Linux/UNIX)。 | 仅 Linux 支持。 |
适用场景 | 低并发、跨平台场景(如嵌入式)。 | 中等并发场景。 | 高并发、Linux 服务器场景(如 Nginx、Redis)。 |
五、epoll 服务器示例代码关键点(C 语言)
c
// 1. 创建epoll实例并设置监听套接字为非阻塞
int epfd = epoll_create1(EPOLL_CLOEXEC);
set_nonblocking(listen_fd); // 自定义函数,通过fcntl设置O_NONBLOCK// 2. 注册监听套接字到epoll(ET模式)
struct epoll_event event = {.events = EPOLLIN | EPOLLET,.data = {.fd = listen_fd}
};
epoll_ctl(epfd, EPOLL_CTL_ADD, listen_fd, &event);// 3. 处理新连接(ET模式下需循环accept直到EAGAIN)
if (fd == listen_fd) {while (1) {int connfd = accept(listen_fd, &cliaddr, &addrlen);if (connfd == -1) {if (errno == EAGAIN || errno == EWOULDBLOCK) break; // 无新连接perror("accept");exit(EXIT_FAILURE);}set_nonblocking(connfd); // 客户端套接字也需设为非阻塞epoll_ctl(epfd, EPOLL_CTL_ADD, connfd, &event); // 注册读事件(ET模式)}
}// 4. 处理读事件(ET模式下需循环recv直到EAGAIN)
else {char buf[BUFFER_SIZE];while (1) {ssize_t n = recv(fd, buf, sizeof(buf), 0);if (n == -1) {if (errno == EAGAIN || errno == EWOULDBLOCK) break; // 数据读完perror("recv");close(fd);epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL);break;} else if (n == 0) { // 客户端关闭连接close(fd);epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL);break;}// 处理数据...}
}
六、总结
- epoll 优势:
- 高并发:基于红黑树和激活列表,适合管理上万级连接。
- 高性能:事件通知复杂度 O (1),减少 CPU 消耗。
- 灵活性:支持 LT/ET 模式,适配不同场景。
- 使用建议:
- 高并发服务器首选 epoll,配合 ET 模式和非阻塞 I/O。
- 简单场景或跨平台需求使用 select/poll。
- 注意设置文件描述符非阻塞,避免 ET 模式下的数据丢失。
相关文章:
服务器连接多客户端
一、epoll 核心函数详解 1. epoll_create/epoll_create1 - 创建 epoll 实例 c #include <sys/epoll.h> int epoll_create(int size); // Linux 2.6.8前需指定size(>1),后续版本可忽略 int epoll_create1(int flags); // 推荐使用…...
驿客时光影院酒店升级:雷克赛恩 Cyber Pro 1 如何重塑住宿观影体验
一、影院式酒店新趋势:当住宿邂逅沉浸式观影体验 (一)驿客时光的差异化突围 成都温江区的驿客时光影院酒店,凭借 “百寸巨幕观影 舒适住宿” 的差异化定位,成为年轻旅客打卡热点。其 20 间主题客房均配备独立投影设…...
Cinema4D 26.014
添加图片注释,不超过 140 字(可选) 软件概述 Cinema 4D是德国MAXON公司开发的一款专业的3D动画、建模、仿真和渲染软件解决方案,在3D设计领域应用广泛。 功能特点 强大的建模功能 多边形建模:提供了丰富的多边形建模…...
脚本语言Lua
本文来源 :腾讯元宝 Lua是一种轻量级、可嵌入的脚本语言,由巴西里约热内卢天主教大学的Roberto Ierusalimschy、Waldemar Celes和Luiz Henrique de Figueiredo于1993年开发。其设计目标是嵌入应用程序中,提供灵活的扩展和定制功能。 主要特性…...
106. 从中序与后序遍历序列构造二叉树
https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/?envTypestudy-plan-v2&envIdtop-interview-150思路:我们知道后序的顺序是左右根,所以后序数组的最后一个一定是根节点,然后中序…...
全链路压测实战指南:从理论到高可用架构的终极验证
全链路压测实战指南:从理论到高可用架构的终极验证 引言:你的系统,真的准备好迎接洪峰了吗? 凌晨3点,某大型电商平台秒杀活动突袭上线。百万用户同时涌入,订单接口响应时间从200ms飙升到15秒,数据库连接池被瞬间耗尽,支付服务直接“熔断”,连锁反应导致库存混乱、物流…...
分布式AI推理的成功之道
随着AI模型逐渐成为企业运营的核心支柱,实时推理已成为推动这一转型的关键引擎。市场对即时、可决策的AI洞察需求激增,而AI代理——正迅速成为推理技术的前沿——即将迎来爆发式普及。德勤预测,到2027年,超半数采用生成式AI的企业…...
纯前端实现基于位置的天气和动态背景图片
如何为博客首页实现基于位置的天气和动态背景图片 引言 我为我的博客主页添加了根据用户所在位置显示当地天气、日出日落时间,并加载一张与天气和时间段匹配的高质量背景图片,可以显著提升用户体验。想象晴天时展示阳光普照的田野,雨天时呈现…...
1.1 认识编程与C++
认识编程与C教程 目标 理解程序、指令、数据的概念。了解C在现实中的应用场景。学会搭建编程环境,迈出第一步。 一、编程是什么?——给计算机写“魔法指令” 1. 基本概念 程序:一系列指令的集合,像一本“魔法食谱”。 &#x…...
代码随想录算法训练营第60期第三十七天打卡
大家好,今天我们算法训练营的第37天,首先为自己感到骄傲,居然坚持下来了,本来觉得自己可能坚持不下来,但是我硬是坚持下来了,好样的,同时也感谢那些看我的题解给我点赞的朋友,我在这…...
每周靶点:TIGIT、ICAM1及文献分享
本期精选了《抑制性受体TIGIT》《细胞粘附分子ICAM1》《真核蛋白表达:选择合适的条件进行》《文献分享:双特异性和多特异性抗体的可开发性评估》四篇文章。以下为各研究内容的概述: 抑制性受体TIGIT TIGIT是一种具有Ig和ITIM结构域的T细胞免…...
介绍一下什么是 AI、 AGI、 ASI
1. AI(人工智能):工具化的“窄域智能” 定义: AI 是能够执行特定任务的智能系统,依赖大量数据和预设规则,缺乏自主意识和跨领域通用性。 特点: 任务专用:如图像识…...
部署安装jenkins.war(2.508)
实验目的:部署jenkins,并与gitlab关联bulid 所需软件:jdk-17_linux-x64_bin.tar.gz jenkins.war apache-tomcat-10.1.40.tar.gz 实验主机:8.10具有java环境,内存最少为4G,cpu双核 目录 jdk安装 …...
【歌曲结构】2:小节与歌曲结构信息整合
歌曲小节与结构信息整合 我将为您整合小节信息与歌曲结构,创建一个更加详细的JSON数据结构。 处理方法 将小节时间与歌曲结构段落进行匹配为每个小节添加所属段落信息为小节添加格式化的时间戳为小节添加对应时间范围内的歌词{"song_title": "财神庙前许三亿…...
商城系统前端
商城系统的前端技术涉及多个层面的技术选型与架构设计,结合搜索结果中的信息,以下是商城系统前端技术的核心要点及实现方案: 一、基础技术栈 HTML5 & CSS3 功能定位:作为前端开发的基础,…...
OpenSSH 漏洞-SSH 服务器面临 MitM 攻击和拒绝服务攻击的风险
OpenSSH 发布了安全更新,修复了两个漏洞,一个是 MitM 攻击漏洞,另一个是拒绝服务漏洞,其中一个漏洞是在十多年前引入的。Qualys 发现了这两个漏洞,并向 OpenSSH 的维护人员展示了其可利用性。 OpenSSH(开放…...
PostgreSQL MCP 使用案例
## 概述 PostgreSQL MCP(PostgreSQL Multi-host Cluster Provisioning)是一种用于部署和管理多节点PostgreSQL集群的工具和架构。它提供了高效的数据库集群管理、高可用性保障和负载均衡功能。本文档将介绍PostgreSQL MCP的基本使用方法和常见应用场景。…...
什么是接口文档,如何使用,注意事项有哪些
一、接口文档的核心内容 基础信息 接口名称:明确功能(如“用户登录接口”)。 接口地址:URL 或 RPC 路径(如 /api/v1/login)。 请求方法:HTTP 方法(GET/POST/PUT/DELETE)…...
Swagger go中文版本手册
Swaggo(github.com/swaggo/swag)的注解语法是基于 OpenAPI 2.0 (以前称为 Swagger 2.0) 规范的,并添加了一些自己的约定。 主要官方文档: swaggo/swag GitHub 仓库: 这是最权威的来源。 链接: https://github.com/swaggo/swag重点关注: README.md: 包含了基本的安装、使用…...
[Java实战]Spring Boot + Netty 实现 TCP 长连接客户端及 RESTful 请求转发(二十六)
[Java实战]Spring Boot Netty 实现 TCP 长连接客户端及 RESTful 请求转发(二十六) 在现代微服务架构中,经常需要在不同服务之间进行高效、可靠的通信。本文将介绍如何使用 Spring Boot 结合 Netty 实现一个 TCP 长连接客户端,并…...
ProfibusDP主站转ModbusRTU/TCP与横河AXG电磁流量计通讯案例
ProfibusDP主站转ModbusRTU/TCP与横河AXG电磁流量计通讯案例 在当今数字化工业时代,智能仪表与控制系统的互联互通成为提高生产效率和管理水平的关键。横河AXG电磁流量计作为一款高性能的流量测量设备,在多个行业得到了广泛应用。而Profibus DP作为一种…...
鸿蒙OSUniApp开发的商品详情展示页面(鸿蒙系统适配版)#三方框架 #Uniapp
使用UniApp开发的商品详情展示页面(鸿蒙系统适配版) 前言 随着移动电商的普及,一个体验良好的商品详情页对于提高用户转化率至关重要。本文将分享我在使用UniApp开发商品详情页时的实践经验,并特别关注如何适配鸿蒙系统…...
VMware中快速安装与优化Ubuntu全攻略
准备工作 在开始安装之前,确保已经下载了VMware Workstation或VMware Player,并准备好Ubuntu的ISO镜像文件。VMware Workstation是一款功能强大的虚拟机软件,支持在Windows或Linux主机上运行多个操作系统。 创建虚拟机 打开VMware Worksta…...
本地 PC 使用Offset Explorer连接实体Ubuntu Kafka 【单机】超时问题解决
现状:本地 PC 使用Offset Explorer连接实体Ubuntu Kafka 超时 一、确认kafka是否在9092端口上运行 netstat -tulnp | grep 9092输出 tcp6 0 0 :::9092 :::* LISTEN 66113/java 使用jps查看进程66113的详细信息…...
CSS AI 通义灵码 VSCode插件安装与功能详解
简介 在前端开发领域,页面调试一直是个繁琐的过程,而传统开发中美工与前端的对接也常常出现问题。如今,阿里云技术团队推出的通义灵码智能编码助手,为前端开发者带来了新的解决方案,让开发者可以像指挥者一样…...
MUSE Pi Pro 使用TiTanTools烧录镜像
视频讲解: MUSE Pi Pro 使用TiTanTools烧录镜像 下载windows下的烧录工具 https://cloud.spacemit.com/prod-api/release/download/tools?tokentitantools_for_windows_X86_X64 下载镜像文件,zip后缀的即可 打开软件默认界面 按住FDL键,同时…...
嵌软面试每日一阅----通信协议篇(二)之TCP
一. TCP和UDP的区别 可靠性 TCP:✅ 可靠传输(三次握手 重传机制) UDP:❌ 不可靠(可能丢包) 连接方式 TCP:面向连接(需建立/断开连接) UDP:无连接࿰…...
开机自启动python程序_ubuntu22.04
一、没有设置开机自启动时 1、 conda activate yolo cd /home/orangepi/work_11.15/zipformer 2、 python app.py 二、设置开机自启动流程 1、新建一个文件.service文件 touch zipformer.service 2、最重要的找到你自己的环境路径 这个是我的 yolo的虚拟环境在ÿ…...
8、SpringBoot集成MinIO
8、SpringBoot集成MinIO https://xiaoxueblog.com/ai/SpringBoot%E9%9B%86%E6%88%90MinIO.html 1、pom <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.12</version> </dependency>2…...
LeRobot 框架的核心架构概念和组件(下)
本文档概述构成 LeRobot 框架的核心架构概念和组件。它介绍主要的子系统,并解释它们如何相互作用以实现机器人学习。 。。。。。。继续。。。。。。 机器人控制系统 机器人控制系统提供统一的接口来控制实体机器人。它支持不同的控制模式和机器人类型,…...
ubuntu18 设置静态ip
百度 编辑/etc/netplan/01-netcfg.yaml 系统没有就自己编写 network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no addresses: [192.168.20.8/24] # 设置你的IP地址和子网掩码 gateway4: 192.168.20.1 # 网关地址 namese…...
QML元素 - ThresholdMask
QML 的 ThresholdMask 用于根据阈值将源元素与遮罩元素的像素值进行比较,通过设定阈值范围来控制源元素的可见区域。它适用于基于亮度、透明度或颜色通道的动态遮罩效果,例如游戏中的血条、进度指示器或图像处理中的抠图。以下是详细使用技巧和场景示例&…...
[项目深挖]仿muduo库的并发服务器的解析与优化方案
标题:[项目深挖]仿muduo库的并发服务器的优化方案 水墨不写bug 文章目录 一、buffer 模块(1)线性缓冲区直接扩容---->环形缓冲区定时扩容(只会扩容一次)(2)使用双缓冲(Double Buf…...
(独家)SAP CO模块中 销售发票对应的Cost Document中的PSG对象是什么东东??
背景: 在销售发票生成的凭证中,控制凭证有两个字段:对象类型、对应编码;那这个PSG到底是什么东东?网上一直没人解释,可能没人研究过这个问题。 官方解释: 按我的理解,PSG profile …...
流程编辑器Bpmn与LogicFlow学习
工作流技术如何与用户交互结合(如动态表单、任务分配)处理过 XML 与 JSON 的转换自定义过 bpmn.js 的样式(如修改节点颜色、形状、图标)扩展过上下文菜单(Palette)或属性面板(Properties Panel&…...
群晖NAS部署PlaylistDL音乐下载器结合cpolar搭建私有云音乐库
文章目录 前言1.关于PlaylistDL音乐下载器2.Docker部署3.PlaylistDL简单使用4.群晖安装Cpolar工具5.创建PlaylistDL音乐下载器的公网地址6.配置固定公网地址总结 前言 各位小伙伴们,你们是不是经常为了听几首歌而开通各种平台的VIP?或者为了下载无损音质…...
Unity光照笔记
问题 在做项目中遇到了播放中切换场景后地面阴影是纯黑的问题,不得不研究一下光照。先放出官方文档。 Lighting 窗口 - Unity 手册 播放中切换场景后地面阴影是纯黑 只有投到地面的阴影是纯黑的。且跳转到使用相同Terrain的场景没有问题。 相关文章:…...
【ROS2】编译Qt实现的库,然后链接该库时,报错:/usr/bin/ld: XXX undefined reference to `vtable for
1、问题描述 在ROS2工程中,编译使用Qt实现的库,在其它ROS2包链接该库时,报错: /usr/bin/ld: XXX undefined reference to `vtable for2、原因分析 查看链接失败的几个函数接口都是,信号函数(signals 标记的函数)。因为信号函数都只有定义,没有实现,在执行ROS2 colc…...
deepseek讲解如何快速解决内存泄露,内存溢出问题
Java内存泄漏与内存溢出解决方案及预防措施 作为Java架构师,处理内存泄漏和内存溢出问题需要系统性的方法。以下是一份完整的解决方案和预防建议: 一、问题诊断阶段 1. 确认内存泄漏现象 监控GC日志,观察老年代使用率是否持续增长使用jst…...
双系统重装ubuntu
双系统ubuntu20.04重装(详细版)_ubuntu20.04安装教程-CSDN博客...
图形语言中间层:重构 AI 编程的未来之路
在软件开发的历史长河中,每一次技术革新都伴随着对效率与可控性的重新定义。当 ChatGPT、GitHub Copilot 等 AI 工具以自然语言生成代码的惊艳表现叩响编程世界的大门时,人们曾满怀憧憬地期待一个 “无代码” 的黄金时代 —— 只需用日常语言描述需求&am…...
Ubuntu操作合集
UFWUncomplicated Firewall 查看状态和规则: 1查看状态sudo ufw status, 2查看详细信息sudo ufw status verbose, 默认策略配置: 1拒绝所有入站sudo ufw default deny incoming 2允许所有出战sudo ufw default allow outgoing …...
张量与Python标量:核心区别与计算图断开解析
张量与Python标量的核心区别 张量(Tensor) 是PyTorch中的核心数据结构,类似于多维数组: 支持GPU加速计算跟踪计算历史(用于自动求导)可以包含多个元素Python标量(int/float) 是普通的Python数值类型: 不支持GPU加速没有计算历史记录单个独立数值计算图断开的原因 Py…...
U9C与钉钉审批流对接完整过程
U9C 功能强大,然而在移动办公和审批流方面存在一定不足。为了弥补这一缺陷,不少企业在使用 U9C 的同时,会选择开通钉钉这类 OA 管理系统。不过,两套系统并行使用时,数据同步问题便随之而来。目前,常见的做法…...
双重差分模型学习笔记4(理论)
【DID最全总结】90分钟带你速通双重差分!_哔哩哔哩_bilibili 目录 总结:双重差分法(DID)在社会科学中的应用:理论、发展与前沿分析 一、DID的基本原理与核心思想 二、经典DID:标准模型与应用案例 三、…...
【Pandas】pandas DataFrame diff
Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...
什么是Agentic AI(代理型人工智能)?
什么是Agentic AI(代理型人工智能)? 一、概述 Agentic AI(代理型人工智能)是一类具备自主决策、目标导向性与持续行动能力的人工智能系统。与传统AI系统依赖外部输入和显式命令不同,Agentic AI在设定目标…...
记录算法笔记(2025.5.15)二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2: 输入…...
2025 Java 微信小程序根据code获取openid,二次code获取手机号【工具类】拿来就用
一、controller调用 /*** 登录** author jiaketao* since 2024-04-10*/ RestController RequestMapping("/login") public class LoginController {/*** 【小程序】登录获取session_key和openid** param code 前端传code* return*/GetMapping("/getWXSessionKe…...
2021-10-25 C++三的倍数含五
缘由含数字五且是三的倍数-编程语言-CSDN问答 void 三的倍数含五() {//缘由https://ask.csdn.net/questions/7544132?spm1005.2025.3001.5141int a 3, aa a;while (a < 10000){if (aa)if (aa % 10 5)std::cout << a << std::ends, aa a 3; else aa / 10;…...