深入探讨 UDP 协议与多线程 HTTP 服务器
深入探讨 UDP 协议与多线程 HTTP 服务器
一、UDP 协议:高效但“不羁”的传输使者
UDP 协议以其独特的特性在网络传输中占据一席之地,适用于对实时性要求高、能容忍少量数据丢失的场景。
1. UDP 的特点解析
- 无连接:无需提前建立连接,如同“不打电话直接寄快递”,减少了连接建立的时间开销,想发就发。
- 不可靠:不保证数据一定到达、不检测错误、不排序。但这也让它省去了复杂的确认机制,适合视频通话、在线游戏等场景,偶尔卡顿或丢包可接受。
- 数据报传输:以“块”为单位传输(数据报),发送端发多少,接收端收多少,保持原始边界。例如发送“abc”和“def”,接收端不会合并为“abcdef”。
- 速度快、开销小:头部仅 8 字节(TCP 为 20 字节),额外负担少,传输效率高,适合直播、DNS 查询等“抢时间”场景。
- 不适应网络拥塞控制:无“减速”机制,网络拥堵时可能丢包更多,但能保持快速发送,与 TCP 的自适应减速形成对比。
- 支持多种通信方式:可单播(一对一)、广播/组播(一对多),如网课直播向多个设备同时发送数据。
一句话总结:UDP 如同“快递急件”,速度快但不确保签收,适合实时性要求高或简单传输的场景。
2. UDP 网络编程代码解析
服务器端(ser.c
)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> int main() { // 创建 UDP 套接字,AF_INET 表示 IPv4,SOCK_DGRAM 表示 UDP 类型,0 表示默认协议 int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd == -1) { perror("socket err"); exit(1); } struct sockaddr_in saddr, caddr; memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_port = htons(6000); // 端口号转网络字节序 saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 绑定本地回环地址 // 绑定套接字到指定地址和端口 int res = bind(sockfd, (struct sockaddr*)&saddr, sizeof(saddr)); if (res == -1) { perror("bind err\n"); exit(1); } while (1) { char buff[128] = {0}; int len = sizeof(caddr); // 接收数据,recvfrom 用于 UDP,可获取发送方地址 int n = recvfrom(sockfd, buff, 128, 0, (struct sockaddr*)&caddr, &len); printf("recvfrom(%s) buff:%s\n", inet_ntoa(caddr.sin_addr), buff); // 向发送方回复“ok” sendto(sockfd, "ok", 2, 0, (struct sockaddr*)&caddr, sizeof(caddr)); } close(sockfd);
}
客户端(cli.c
)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> int main() { int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd == -1) { perror("socket err"); exit(1); } struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(6000); saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); while (1) { printf("input:\n"); char buff[128] = {0}; fgets(buff, 128, stdin); if (strncmp(buff, "end", 3) == 0) { break; } // 向服务器发送数据 sendto(sockfd, buff, strlen(buff) - 1, 0, (struct sockaddr*)&saddr, sizeof(saddr)); memset(buff, 0, 128); int len = sizeof(saddr); // 接收服务器响应 recvfrom(sockfd, buff, 128, 0, (struct sockaddr*)&saddr, &len); printf("buff(%s):%s\n", inet_ntoa(saddr.sin_addr), buff); } close(sockfd);
}
- 服务器端:创建 UDP 套接字,绑定到
127.0.0.1:6000
,循环接收客户端数据,打印发送方 IP 和数据,回复“ok”。 - 客户端:创建 UDP 套接字,循环读取用户输入,发送给服务器,接收并打印服务器响应,输入“end”时退出。
二、多线程 HTTP 服务器:构建 Web 通信枢纽
HTTP 协议(端口 80,HTTPS 为 443)是应用层的核心协议,基于 TCP 协议,具有无状态、简单灵活等特点,广泛用于 Web 通信。多线程设计使其能并发处理多个客户端请求,提升性能。
1. HTTP 协议深度解析
-
请求方法:常见的有
GET
(获取资源)、POST
(提交数据)、PUT
(更新资源)、DELETE
(删除资源)等。例如,浏览器访问网页使用GET
请求获取页面内容。
-
状态码:
2xx
(如200 OK
):表示请求成功。4xx
(如404 NOT FOUND
):客户端错误,资源不存在。5xx
(如500 Internal Server Error
):服务器内部错误。
-
长连接与短连接:
- 短连接:每次请求都新建 TCP 连接,完成后关闭。适用于请求不频繁的场景,如普通网页浏览。
- 长连接(Keep-Alive):多个请求复用一个 TCP 连接,减少连接建立开销,提升效率,适用于频繁交互的场景,如单页应用(SPA)。
-
无状态特性:HTTP 协议本身不记录客户端状态,通过
Cookie
、Session
等机制实现会话跟踪。例如,用户登录后,服务器通过Cookie
识别用户后续请求。 -
http请求报文如下图 :
-
http应答报文如下图
2. 多线程 HTTP 服务器代码详解
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <fcntl.h> #define PATH "/home/stu/0101/http"
int socket_init();
char *strtok_fun(char buff[]) { char *saveptr; // 解析请求头第一行,获取请求的文件名。例如,对于“GET /index.html HTTP/1.1”,提取“/index.html” char *p = strtok_r(buff, " ", &saveptr); if (p != NULL) { p = strtok_r(NULL, " ", &saveptr); return p; } return NULL;
} void *thread_fun(void *arg) { int c = *((int *)arg); free(arg); while (1) { char buff[1024] = {0}; int n = recv(c, buff, 1024, 0); if (n == 0) { // 客户端关闭连接,recv 返回 0 break; } if (n == -1) { perror("recv err"); break; } char *filename = strtok_fun(buff); if (filename == NULL) { break; } if (strcmp(filename, "/") == 0) { filename = "/index.html"; // 若请求根路径,默认返回 index.html } char path[256]; strcpy(path, PATH); strcat(path, filename); printf("path:%s\n", path); int file_id = open(path, O_RDONLY); if (file_id == -1) { // 文件不存在,构造 404 响应头 char head[256] = {"HTTP/1.1 404 NOT FOUND\r\n"}; strcat(head, "Server: myhttp\r\n"); sprintf(head + strlen(head), "Content-Length: 0\r\n"); strcat(head, "\r\n"); send(c, head, strlen(head), 0); break; } int filesize = lseek(file_id, 0, SEEK_END); lseek(file_id, 0, SEEK_SET); char head[256] = {"HTTP/1.1 200 OK\r\n"}; strcat(head, "Server: myhttp\r\n"); sprintf(head + strlen(head), "Content-Length: %d\r\n", filesize); strcat(head, "\r\n"); send(c, head, strlen(head), 0); // 发送 200 响应头,包含服务器信息、内容长度等 char data[1024] = {0}; int num = 0; while ((num = read(file_id, data, 1024)) > 0) { send(c, data, num, 0); // 分块读取文件内容并发送给客户端 } close(file_id); } printf("cli close"); close(c); pthread_exit(NULL);
} int main() { int sockfd = socket_init(); if (sockfd == -1) { exit(1); } while (1) { int c = accept(sockfd, NULL, NULL); if (c == -1) { perror("accept err"); continue; } pthread_t id; int *p = (int *)malloc(sizeof(int)); *p = c; if (pthread_create(&id, NULL, thread_fun, (void *)p) != 0) { perror("pthread_create err"); free(p); close(c); } else { pthread_detach(id); // 分离线程,使其结束后自动释放资源,避免内存泄漏 } }
} int socket_init() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); // 创建 TCP 套接字,SOCK_STREAM 表示面向连接的 TCP if (sockfd == -1) { perror("socket err"); return -1; } struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(80); // 绑定 80 端口,HTTP 协议默认端口 saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); int res = bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)); if (res == -1) { perror("bind err"); return -1; } if (listen(sockfd, 5) == -1) { perror("listen err"); return -1; } return sockfd;
}
socket_init
函数:初始化 TCP 套接字,绑定到127.0.0.1:80
,通过listen
开始监听,使服务器处于等待客户端连接状态。main
函数:循环调用accept
接收客户端连接。每收到一个连接,创建新线程处理(thread_fun
),通过pthread_detach
分离线程,确保线程结束后资源自动释放,避免服务器资源泄漏。thread_fun
函数:- 读取客户端请求数据,解析请求头获取文件名。
- 根据文件名构造文件路径,尝试打开文件。若文件不存在,发送
404
响应头;若存在,发送200
响应头(包含 HTTP 协议版本、状态码、服务器名称、内容长度等),然后分块读取文件内容并发送给客户端。 - 处理完一个客户端请求后,关闭连接套接字,线程退出。
3. 多线程 HTTP 服务器的优势
- 并发处理:每个客户端连接独立分配线程,多个客户端请求可同时处理,提升服务器吞吐量,避免单个请求阻塞影响整体服务。
- 资源利用:充分利用多核 CPU 资源,线程间相互独立,提高系统资源利用率。
- 响应速度:及时处理客户端请求,减少等待时间,提升用户体验,尤其适合高并发场景,如电商网站、新闻门户等。
UDP 协议以其高效简洁适用于特定场景,而多线程 HTTP 服务器通过并发处理与 HTTP 协议特性结合,成为 Web 通信的重要支柱。深入理解这些技术,能更好地应对网络编程挑战,构建强大稳定的网络应用。
相关文章:
深入探讨 UDP 协议与多线程 HTTP 服务器
深入探讨 UDP 协议与多线程 HTTP 服务器 一、UDP 协议:高效但“不羁”的传输使者 UDP 协议以其独特的特性在网络传输中占据一席之地,适用于对实时性要求高、能容忍少量数据丢失的场景。 1. UDP 的特点解析 无连接:无需提前建立连接&…...
Node.js入门指南:开启JavaScript全栈开发之旅
Hi,我是布兰妮甜 !Node.js让JavaScript突破了浏览器的限制,成为全栈开发的利器。作为基于V8引擎的高性能运行时,它彻底改变了JavaScript只能做前端开发的局面。本文将带你快速掌握Node.js的核心用法:环境搭建与模块系统…...
【STM32F1标准库】理论——通信协议:串口
目录 一、简介 二、连接方式 三、串口参数与时序 1.参数 2.时序 四、STM32实现串口通信的方法 1.使用软件模拟 2.使用硬件外设 杂谈 1.通信的目的 2.常见可以使用串口通信的模块 3.串口常用电平标准 4.串口从波形反推数据 5.奇偶校验 一、简介 命名:USART&#…...
轻松管理房间预约——启辰智慧预约小程序端使用教程
欢迎您使用《启辰智慧预约》场所预约小程序,您可以通过本小程序预约会议室/活动室等,并在预约审批通过后,获取临时开锁密码,开锁密码会在预约时间前30分钟生效。以下是本程序的使用流程。 一、创建单位(新用户注册&am…...
如何在自己的服务器上部署静态网页并通过IP地址进行访问
文件放置 cd /var目录 新建www目录 进入www目录 新建html目录用于放置文件以及相关资源 修改配置文件 sudo nano /etc/nginx/sites-available/default修改index部分的html文件名 修改端口映射避免80冲突 重启Nginx sudo systemctl restart nginx打开浏览器访问即可 h…...
802.11s Mesh 组网框架流程
协议标准 使用 802.11s (标准 Mesh 协议) 基础流程框架 连接流程本质:Beacon → Peer Link → HWMP 路径发现 → 数据传输。mesh与easymesh的区别 阶段详解 阶段1:Beacon广播 作用:周期性宣告Mesh网络存在,同步参数(如Mesh …...
gitcode 上传文件报错文件太大has exceeded the limited size (10 MiB) in commit
登陆gitcoe,在项目设置->提交设置 ,勾选提交文件限制,修改限制的大小。 修改完后,重新提交代码。...
C++代码随想录刷题知识分享-----判断两个字符串是否为字母异位词(Anagram)【LeetCode 242】
✨ 题目描述 给定两个字符串 s 和 t,请判断 t 是否是 s 的字母异位词。 📌 示例 1: 输入:s "anagram", t "nagaram" 输出:true📌 示例 2: 输入:s "…...
Canal mysql to mysql 增加 online 库同步配置指南
Canal 增加新库 online 的配置指南 1. 停止 Canal Adapter 服务 ./bin/stop.sh2. 数据库备份与导入 备份源数据库 mysqldump -h 127.0.0.1 -P 3307 --single-transaction -uroot -p -B online > online.sql导入到目标数据库 mysql -h 127.0.0.1 -P 3308 -uroot -p <…...
Spring MVC中Controller是如何把数据传递给View的?
在 Spring MVC 中,Controller 负责请求的处理,准备需要展示的数据,并将这些数据传递给 View,由 View 负责最终的页面渲染。数据从 Controller 传递到 View 主要通过模型 (Model) 实现。 Spring MVC 提供了以下几种方式让 Control…...
FAST-LIO笔记
1.FAST-LIO FAST-LIO 是一个计算效率高、鲁棒性强的激光-惯性里程计系统。该系统通过紧耦合的迭代扩展卡尔曼滤波器(IEKF)将激光雷达特征点与IMU数据进行融合,使其在快速运动、噪声较大或环境复杂、存在退化的情况下仍能实现稳定的导航。 1…...
挑战用豆包教我学Java01天
今天是豆包教我学Java的第一天,废话不多说直接开始。 1.每日题目: 基础语法与数据类型 题目:编写一个 Java 程序,从控制台读取两个整数,然后计算它们的和、差、积、商,并输出结果。题目:编写…...
基于RT-Thread的STM32G4开发第二讲第二篇——ADC
文章目录 前言一、RT-Thread工程创建二、ADC工程创建三、ADC功能实现1.ADC.c2.ADC.h3.mian.c 四、效果展示和工程分享总结 前言 本文使用的是RT-Thread最新的驱动5.1.0,兼容下面的所有驱动。使用的开发板是蓝桥杯嵌入式国信长安的开发板,MCU是STM32G431…...
居民健康监测小程序|基于微信小程序的居民健康监测小程序设计与实现(源码+数据库+文档)
居民健康监测小程序 目录 基于微信小程序的居民健康监测小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、健康科普管理 5.3公告类型管理 3、论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …...
电商双11美妆数据分析
图中展示的是在Jupyter Notebook环境下的Python代码及运行结果。代码利用 seaborn 和 matplotlib 库,以 datal 数据集为基础,绘制上下两个子图。上方子图呈现各店铺中各大类的销售量,下方子图展示各店铺中各大类的销售额,通过条形…...
Spark-Core(双Value类型)
一、RDD转换算子(双Value类型) 1、intersection 函数签名: def intersection(other: RDD[T]): RDD[T] 函数说明:对源 RDD 和参数 RDD 求交集后返回一个新的 RDD 举栗: val dataRDD1 sparkContext.makeRDD(List(…...
【数据库原理及安全实验】实验六 角色访问控制
指导书原文 安全性管理二 【实验目的】 1) 通过语句设置登录用户的权限,实现对不同用户的操作权限的限定。 【实验原理】 1) 定义数据库角色,授予该角色特定权限,建立不同的用户将其置入不同的角色之下,即等于分配了该用户不…...
windows安装micromamba
windows安装 winget install Mamba.Micromamba Set-ExecutionPolicy RemoteSigned micromamba activate 第一次运行会报错,把报错中间那一句init代码跑一下 创建环境什么的和conda一样 把conda换成micromamba就行 绑定快捷键,winget安装&#x…...
vue-quill-editor的失焦事件
vue-quill-editor的用法再此就不再赘述了,只记录我在使用过程中踩的坑。 版本:Vue2 vue-quill-editor3.0.6 封装组件: <vue-quill-editorclass"editor":class"dynamicClasses"ref"myTextEditor"v-model&quo…...
【工具变量】最新华证ESG评级得分数据-含xlsx及dta格式(2009-2024.12)
参考《经济研究》中方先明(2023)的做法,将华证ESG评级进行赋值,指标包含C、CC、CCC、B、BB、BBB、A、AA、AAA共9个等级,将上市公司ESG等级从低到高分别赋值为1至9。将华证ESG评级得分数据更新至2024年12月31日…...
【纯小白博客搭建】Hugo+Github博客部署及主题(stack)美化等界面优化记录
这里写目录标题 HugoGithub博客部署及主题(stack)美化等界面优化写在前面hugo博客搭建教程第一种方案第二种方案 添加浏览量和统计字数添加评论功能添加访客地图 HugoGithub博客部署及主题(stack)美化等界面优化 效果图如下 如果…...
题解:CF2107E Ain and Apple Tree
首先考虑无解的情况。 当这棵树为一条链时,答案取到最大值。证明很简单,假设存在一个节点 u u u 至少有 2 2 2 个孩子节点,任取两个 v 1 , v 2 v_1,v_2 v1,v2,则 dep ( LCA ( v 1 , v 2 ) ) dep ( u ) \text{dep}(\o…...
STM32的看门狗
独立看门狗(IWDG) IWDG简介 独立看门狗(Independent Watchdog,通常缩写为IWDG)主要作用是主要用于检测外界电磁干扰,或硬件异常导致的程序跑飞问题。 WDG本质上是一个12位的递减计数器(滴答定…...
小王包子铺的融资过程以及IPO上市过程
用包子铺来打个通俗易懂的比喻,一步步讲清楚从创业到融资上市的全过程。 🥟 故事背景:老王的包子铺 老王做的包子特别好吃,于是他决定不再只是摆摊,而是创办一家叫 “老王包子铺” 的连锁店。我们就以老王创业为线索&…...
WPF 触发器 Trigger
触发器 Trigger 触发器(Trigger)是 WPF 中的一种机制: 当某个条件满足时,自动改变控件的某些属性,比如颜色、大小、透明度等。 换句话说,就是"如果……那么就……" 的一种规则。 常见触发器类…...
CentOS算法部署
CentOS服务部署 第一章 启动两个算法服务第一步:上传算法文件第二步:安装 tmux第三步:启动服务(1) 启动第一个算法服务(2) 启动第二个算法服务 第四步:关闭防火墙 第一章 启动两个算…...
极狐GitLab 命名空间的类型有哪些?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 命名空间 命名空间在极狐GitLab 中组织项目。因为每一个命名空间都是单独的,您可以在多个命名空间中使用相同的项…...
使用 Apache POI 生成包含文本和图片的 Word 文档
一、概述 在实际开发场景中,我们经常需要自动生成包含文本和图片的 Word 文档。本示例借助 Apache POI 库,实现了向 Word 文档中插入文本和图片的功能。代码会循环插入多次文本和同一张图片,并且对图片进行等比缩放处理,以保证图片…...
Eclipse通过Tomcat启动web项目报错
错误内容:Caused by: java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext。 本来运行的好好的,执行了Maven->Update Porject后就报上面的错。 通过检查发现,执行上面的命令后会将下面截图中的maven depen…...
5.7线性动态规划1
P2285 [HNOI2004] 打鼹鼠 #include<bits/stdc.h> using namespace std; struct node{int x, y, t; }a[100010]; int dp[100010]; void solve(){int n, m; cin >> n >> m;for(int i 1; i < m; i){cin >> a[i].t >> a[i].x >> a[i].y;}…...
Word如何制作三线表格
1.需求 将像这样的表格整理成论文中需要的三线表格。 2.直观流程 选中表格 --> 表格属性中的边框与底纹B --> 在设置中选择无(重置表格)–> 确定 --> 选择第一行(其实是将第一行看成独立表格了,为了设置中线&…...
【Mybatis-plus常用语法】
MyBatis-Plus 是 MyBatis 的增强工具,提供了很多便捷的功能来简化开发。以下是一些 MyBatis-Plus 的常见语法: 实体类注解:使用 TableName 注解来指定实体类和数据库表的映射关系。 TableName("user") public class User {privat…...
16.Excel:数据收集
一 使用在线协作工具 简道云。 excel的在线表格协作在国内无法使用,而数据采集最需要在线协作。 二 使用 excel 1.制作表格 在使用excel进行数据采集的时候,会制作表头给填写人,最好还制作一个示例。 1.输入提示 当点击某个单元格的时候&am…...
基于Django框架开发的企业级IT资产管理系统
CMDB 资产管理系统 资产管理系统是一个基于Django框架开发的企业级IT资产管理平台,专注于数据中心和IT设备的全生命周期管理。该系统提供了完整的资产管理功能,包括设备管理、数据中心管理、用户权限管理等核心功能。 项目截图 技术栈 后端 Python 3…...
Redis 集群版本升级指南:从 Redis 7 升级到 Redis 8
Redis 集群升级主要有两种方案: 1、在线滚动升级(无需停机) 2、停机升级(需停止服务) 一、准备工作 1. 下载 Redis 8 安装包 # Redis 8.0.0 示例(请替换为实际版本) http://download.redis.io…...
使用 Couchbase Analytics Service 的典型步骤
下面是使用 Couchbase Analytics Service 的典型步骤,包括部署、配置、创建数据集、运行查询以及监控优化等环节。 首先,您需要安装并启用 Analytics 服务;然后将节点加入集群并重平衡;接着在 Analytics 中映射数据服务的集合&am…...
C++ stl中的vector的相关用法 迭代器失效问题
文章目录 vector的介绍及使用vector的定义 vector的空间相关问题vector的迭代器的使用vector的增删查改vector迭代器失效问题 vector的介绍及使用 1、vector是用于表示可变大小数组的序列容器。 2、vector就像数组一样,采用的是连续的空间来存储元素,也…...
【Redis】哨兵机制和集群
🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 一、哨兵机制 Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工的进行主从切换,同时需要大量的客户端需要被通知切换到…...
uni-app 引入vconsole web端正常,安卓端报错 Cannot read property ‘sendBeacon‘ of undefined
reportJSException >>>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->Uncaught TypeError: Cannot read property sendBeacon of undefined vconsole 只支持 web 端,…...
数据管道的解耦艺术:Dagster I/O管理器实现存储与逻辑分离
在现代数据工程中,高效管理数据的读写逻辑是构建可维护管道的关键。Dagster的**I/O管理器(I/O Managers)**通过分离数据处理与数据存储逻辑,显著提升了代码的可复用性和灵活性。本文将深入解析其核心概念、应用场景及实战示例。 一…...
shell脚本--2
1、实时监控cpu、内存的shell脚本 #!/bin/bash# 获取当前时间 DATE$(date "%Y-%m-%d %H:%M:%S")# 获取CPU使用情况 CPU_USAGE$(top -b -n1 | grep "Cpu(s)" | awk {print $2 $4})# 获取内存使用情况 MEMORY_USAGE$(free | grep Mem | awk {print $3/$2 *…...
jenkins配置多nexus仓库多maven版本
jenkins多环境多nexus仓库,多maven版本 使用优化,jenkins多环境多nexus仓库,多maven版本 1、多settings.xml设置构建 背景:jenkins本地安装一个maven版本,默认只有一个settings.xml文件指定本地和远端nexus仓库&#x…...
Linux理解文件fd
先来段代码回顾C文件接口 myfile.c写文件 #include <stdio.h>int main() {FILE *fp fopen("log.txt","a");if(NULL fp){perror("fopen");return 1;}fprintf(fp,"helloWorld,%d,%s,%lf\n",10,"lsf",3.14);fclose(fp)…...
【Python】os模块
os 模块是 Python 标准库中用于与操作系统交互的核心模块,提供了许多操作文件和目 录的函数。 1. 基本介绍 os 模块提供了以下主要功能: 文件和目录操作路径操作进程管理环境变量访问 import os2. 常用功能分类 2.1 文件和目录操作 函数/方法描述o…...
2025 Mac常用软件安装配置
1、homebrew 2、jdk 使用brew安装jdk: 配置环境变量: 3、maven 使用brew安装maven: 配置环境变量: 4、光标平滑移动 5、鼠标滚轮调整 mos 6、常用的终端工具 tabby 7、软件卸载 腾讯柠檬:https://lemon.qq.com/ 8、…...
PyQt5 实现自定义滑块,效果还不错
最近,黄老师闲来无事,需要做一个 播放器的滑块,但是Qt官方的长这个样子,不太好看 于是我自己写了一个,效果还不错,请看下面的效果图: 功能可以点击,可以拖拽改变进度,和播放器的进度条一样 源码如下: 需要的自取 import sys from PyQt5.QtWidgets import QApplicat…...
如何在ENVI Classic 和 ENVI中进行波段合成
示例使用Landsat的三个波段进行合成为示例,合成后展示为假彩色。 对应关系为: Red -- b4(近红外 near-infrared)NIR Green -- b3 (红光 Red) Blue -- b2 (绿光 Green) 一、ENVI…...
协方差与皮尔逊相关系数:从定义到应用的全面解析
目录 一、协方差与皮尔逊相关系数的定义1.1 协方差(Covariance)1.2 皮尔逊相关系数(Pearson Correlation Coefficient) 二、协方差的定义与推导逻辑2.1 核心目标:衡量变量的“协同变化”2.2 数学表达的直观性2.3 从线性…...
ICML 2025录取率公布,spotlight posters仅占2.6%
近日,ICML 2025公布了论文录用结果。本次大会共收到 12,107篇有效论文投稿,比去年增加了28%,今年录取论文3,260篇,录取率为 26.9%。其中仅有313篇被列为“焦点海报”(即所有投稿中排名前2.6%的论文)&#x…...
kotlin一个函数返回多个值
一、主要实现方式 1. Pair/Triple 元组 用途:临时快速返回 2 或 3 个简单值,适用于简单场景语法: fun getStatus(): Pair<Int, String> {return Pair(200, "Success") // 等价于 200 to "Success" }// 解构接收 …...