【嵌入式Linux应用开发基础】网络编程(4):UDP协议
目录
一、UDP 协议概述
二、UDP 协议特点
三、UDP协议的字段格式
四、UDP协议的数据传输过程
五、嵌入式UDP编程核心API
六、UDP 在嵌入式 Linux 中的编程实现
6.1 UDP 服务器代码示例
6.2 UDP 客户端代码示例
七、UDP 协议的应用场景
八、UDP 协议的优缺点
8.1 优点
8.2 缺点
九、嵌入式开发注意事项
9.1. 资源优化
9.2. 错误处理
9.3. 多播实现
9.4. 超时控制
9.5. 交叉编译注意事项
十、调试技巧
十一、性能优化策略
十二、参考资料
UDP(User Datagram Protocol,用户数据报协议)协议是一种基于IP协议的不可靠网络传输协议,它是TCP/IP协议栈中传输层的一部分。与TCP协议相比,UDP协议具有轻量级、无需建立连接、资源消耗少、通信效率高等特点。
一、UDP 协议概述
UDP是一种无连接的传输层协议,与 TCP 不同,它不保证数据的可靠传输、不保证数据的顺序性,也没有拥塞控制机制。UDP 协议具有开销小、传输速度快的特点,适用于对实时性要求较高、对少量数据丢失不太敏感的应用场景。在嵌入式 Linux 应用开发中,UDP 常用于实时音视频传输、游戏、传感器数据采集等领域。
二、UDP 协议特点
- 无连接:在进行数据传输之前,不需要像 TCP 那样建立连接,发送方只需知道接收方的 IP 地址和端口号,就可以直接发送数据。减少了建立和维护连接的开销,提高了数据传输的速度。
- 不可靠传输:UDP 不保证数据的可靠传输,数据在传输过程中可能会丢失、重复或乱序。发送方不会等待接收方的确认信息,也不会进行重传操作。因此,应用程序需要自己处理数据丢失和乱序的问题。
- 面向数据报:UDP 将应用层的数据封装成一个个独立的数据报进行传输,每个数据报都有自己的头部和数据部分。数据报的大小受到网络最大传输单元(MTU)的限制,通常不能超过 65507 字节(包括 UDP 头部 8 字节)。
- 开销小:UDP 头部只有 8 个字节,相比 TCP 头部(通常 20 字节以上)开销更小,这使得 UDP 在传输少量数据时更加高效。
三、UDP协议的字段格式
UDP协议的字段格式包括以下几个部分:
- 源端口号:16位字段,表示发送方的UDP端口。
- 目的端口号:16位字段,表示接收方的UDP端口。
- UDP长度:表示UDP头部和UDP数据段的长度,单位为字节。由于UDP头部为8个字节,因此发送UDP的长度字段最少为8字节。
- UDP校验和:表示整个UDP字段的CRC16校验和,用于检测数据在传输过程中是否发生错误。校验和字段是可选的,即可以不进行CRC校验,此时校验和部分为全0。
四、UDP协议的数据传输过程
UDP协议的数据传输过程包括封包和解封包两个步骤:
①封包:在发送方,用户发送的数据在传输层增加UDP头部,封装在UDP的数据部分。然后,在IP层增加IP头部数据,将UDP的数据和头部都封装在IP层的数据部分。最后,IP层将数据传输给网络设备的驱动程序,以太网增加头部和尾部后,发送到以太网上。
②解封包:在接收方,驱动程序从以太网上接收到数据后,去除头部和尾部并进行CRC校验。然后,将正确的数据传递给IP层,IP层剥去IP头后进行校验,并将数据发送给其上层UDP层。UDP层将UDP的包头剥去后,根据应用程序的标识符判断是否发送给此应用程序。
五、嵌入式UDP编程核心API
#include <sys/socket.h>// 创建socket
int socket(int domain, int type, int protocol); // SOCK_DGRAM// 绑定地址
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);// 接收数据(带来源地址)
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);// 发送数据
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
六、UDP 在嵌入式 Linux 中的编程实现
在嵌入式Linux应用开发中,可以使用socket编程接口来实现UDP协议的数据传输。具体步骤如下:
- 创建socket:使用socket()函数创建一个新的socket,指定使用的地址类型和协议(如PF_INET和SOCK_DGRAM表示使用IPv4和UDP协议)。
- 绑定地址和端口:使用bind()函数将本地地址和端口号绑定到socket上。
- 发送数据:使用sendto()函数指定目标地址和端口号发送数据。
- 接收数据:使用recvfrom()函数接收来自指定地址和端口号的数据。
6.1 UDP 服务器代码示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>#define PORT 8888
#define BUFFER_SIZE 1024int main() {int sockfd;struct sockaddr_in server_addr, client_addr;socklen_t client_addr_len = sizeof(client_addr);char buffer[BUFFER_SIZE];// 创建 UDP 套接字if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}memset(&server_addr, 0, sizeof(server_addr));memset(&client_addr, 0, sizeof(client_addr));// 填充服务器地址信息server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(PORT);// 绑定套接字到指定地址和端口if (bind(sockfd, (const struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}printf("UDP server listening on port %d...\n", PORT);while (1) {// 接收客户端数据ssize_t recv_len = recvfrom(sockfd, (char *)buffer, BUFFER_SIZE, MSG_WAITALL,(struct sockaddr *)&client_addr, &client_addr_len);if (recv_len < 0) {perror("recvfrom failed");continue;}buffer[recv_len] = '\0';printf("Client: %s\n", buffer);// 发送响应数据给客户端const char *response = "Message received";sendto(sockfd, (const char *)response, strlen(response), MSG_CONFIRM,(const struct sockaddr *)&client_addr, client_addr_len);printf("Response sent to client\n");}// 关闭套接字close(sockfd);return 0;
}
首先创建一个 UDP 套接字,然后将其绑定到指定的 IP 地址和端口。使用 recvfrom
函数接收客户端发送的数据,并使用 sendto
函数发送响应数据给客户端。
6.2 UDP 客户端代码示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>#define SERVER_IP "127.0.0.1"
#define PORT 8888
#define BUFFER_SIZE 1024int main() {int sockfd;struct sockaddr_in server_addr;char buffer[BUFFER_SIZE];// 创建 UDP 套接字if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}memset(&server_addr, 0, sizeof(server_addr));// 填充服务器地址信息server_addr.sin_family = AF_INET;server_addr.sin_port = htons(PORT);if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0) {perror("Invalid address/ Address not supported");exit(EXIT_FAILURE);}const char *message = "Hello, server!";// 发送数据到服务器sendto(sockfd, (const char *)message, strlen(message), MSG_CONFIRM,(const struct sockaddr *)&server_addr, sizeof(server_addr));printf("Message sent to server\n");socklen_t server_addr_len = sizeof(server_addr);// 接收服务器响应数据ssize_t recv_len = recvfrom(sockfd, (char *)buffer, BUFFER_SIZE, MSG_WAITALL,(struct sockaddr *)&server_addr, &server_addr_len);if (recv_len < 0) {perror("recvfrom failed");exit(EXIT_FAILURE);}buffer[recv_len] = '\0';printf("Server: %s\n", buffer);// 关闭套接字close(sockfd);return 0;
}
创建一个 UDP 套接字,填充服务器的地址信息,使用 sendto
函数发送数据到服务器,然后使用 recvfrom
函数接收服务器的响应数据。
七、UDP 协议的应用场景
- 实时音视频传输:如视频会议、在线直播等应用,对实时性要求较高,允许少量数据丢失。UDP 协议的低延迟特性可以保证音视频的流畅播放。
- 游戏:在网络游戏中,需要快速传输玩家的操作信息,对实时性要求极高。UDP 协议可以满足游戏对低延迟的需求,即使少量数据包丢失,也不会对游戏体验造成太大影响。
- 传感器数据采集:在物联网应用中,传感器需要实时将采集到的数据发送到服务器。由于传感器数据通常较小且对实时性要求较高,UDP 协议是一种合适的选择。
八、UDP 协议的优缺点
8.1 优点
- 实时性好:无连接的特性使得数据可以立即发送,不需要等待连接建立和确认过程,减少了传输延迟。
- 开销小:UDP 头部简单,数据传输的额外开销小,适合传输少量数据。
- 简单灵活:应用程序可以根据自己的需求对数据进行处理,不需要依赖 UDP 协议提供的复杂机制。
8.2 缺点
- 不可靠传输:数据可能会丢失、重复或乱序,需要应用程序自己处理这些问题。
- 缺乏拥塞控制:UDP 协议没有拥塞控制机制,当网络拥塞时,可能会导致大量数据包丢失,影响网络性能。
九、嵌入式开发注意事项
9.1. 资源优化
-
设置合理的数据包大小(通常不超过1472字节,避免IP分片)
-
使用
SO_RCVBUF
/SO_SNDBUF
调优socket缓冲区
9.2. 错误处理
// 检查无效socket描述符
if(fcntl(sockfd, F_GETFL) < 0 && errno == EBADF) {// 处理socket失效
}
9.3. 多播实现
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("239.255.255.250");
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
9.4. 超时控制
struct timeval tv;
tv.tv_sec = 2; // 2秒超时
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
9.5. 交叉编译注意事项
-
确保使用正确的工具链
-
检查字节序(嵌入式设备多为小端模式)
-
验证内核UDP协议栈配置
十、调试技巧
使用netcat
测试:
# 接收测试
nc -ul 8888# 发送测试
echo "test" | nc -u 192.168.1.100 8888
抓包分析:
tcpdump -i eth0 udp port 8888 -vv -X
查看socket状态:
netstat -anu | grep 8888
十一、性能优化策略
使用多线程处理I/O:
pthread_create(&recv_thread, NULL, udp_recv_handler, &sockfd);
零拷贝技术(Linux 4.1+):
setsockopt(sockfd, SOL_SOCKET, SO_ZEROCOPY, &enable, sizeof(enable));
批量数据发送:
struct mmsghdr msgs[10];
sendmmsg(sockfd, msgs, 10, 0);
掌握这些UDP编程技术后,开发者可以在嵌入式Linux系统中实现高效的网络通信,特别适合需要快速响应、可接受少量数据丢失的物联网应用场景。实际开发中需根据具体硬件资源和应用需求进行参数调优和可靠性增强设计。
十二、参考资料
- 官方文档与规范:RFC 768:这是 UDP 协议的正式规范文档,详细定义了 UDP 协议的功能、报文格式、校验和计算等内容,是深入了解 UDP 协议的权威资料。
-
Linux 网络编程 - UDP 协议详解:该博客对 UDP 协议在 Linux 环境下的特点、首部格式、校验和计算等方面进行了详细的讲解,并对比了 UDP 和 TCP 协议的优劣,同时给出了一些 UDP 在实际应用中的场景分析。
-
网络协议之 UDP - CSDN 博客:介绍了 UDP 协议的基本概念、特点以及在新兴技术中的应用和面临的挑战,提到了 UDP 在物联网、5G、边缘计算等领域的应用前景,还分析了 UDP 协议在可靠性、安全性和兼容性方面的问题。
相关文章:
【嵌入式Linux应用开发基础】网络编程(4):UDP协议
目录 一、UDP 协议概述 二、UDP 协议特点 三、UDP协议的字段格式 四、UDP协议的数据传输过程 五、嵌入式UDP编程核心API 六、UDP 在嵌入式 Linux 中的编程实现 6.1 UDP 服务器代码示例 6.2 UDP 客户端代码示例 七、UDP 协议的应用场景 八、UDP 协议的优缺点 8.1 优点…...
PS渐变工具
渐变工具:(颜色条 起点到终点 为 前景色到背景色) 渐变shift:垂直、水平、45度 渐变工具–》仿色:让渐变变得细腻。仿色值高,过渡柔和,仿色值低,过渡粗糙 渐变工具–》渐变编辑器&am…...
win11系统通过WSL安装ubuntu
Linux 和Windows windows 属于单用户、多任务 Linux属于多用户多任务。Linux一切皆文件 https://blog.csdn.net/ddafei/article/details/142798010 一、启用WSL功能 首先,你需要在Windows上启用WSL功能。 打开“控制面板”。点击“程序” > “启用或关闭Windo…...
Sqoop从入门到使用
安装和配置 修改文件配置:修改文件名将(sqoop-env-template.sh改为sqoop-env.sh) 编辑sqoop-env.sh内部文本,修改调用文件位置 将sqoop-env.sh,配置到全局变量中,方便调用。 查看正常运用 第一类࿱…...
深度学习奠基作 AlexNet 论文阅读笔记(2025.2.25)
文章目录 训练数据集数据预处理神经网络模型模型训练正则化技术模型性能其他补充 训练数据集 模型主要使用2010年和2012年的 ImageNet 大规模视觉识别挑战赛(ILSVRC)提供的 ImageNet 的子集进行训练,这些子集包含120万张图像。最终ÿ…...
解决python项目无法安装openai模块的问题
问题描述: pip install openai Fatal error in launcher: Unable to create process using ‘“e:\private\github\navigation_site.venv\Scripts\python.exe” “E:\private\github\my_project\navigation_site.venv\Scripts\pip.exe” install OpenAI’: ??? 这…...
项目实践 之 pdf简历的解析和填充(若依+vue3)
文章目录 环境背景最终效果前端讲解左侧模块解析右侧上传模块解析前端步骤 后端讲解代码前端 环境背景 若依前后端分离框架 vue最后边附有代码哦 最终效果 前端讲解 左侧模块解析 1、左侧表单使用el-form 注意: 1、prop出现的字段,需要保证是该类所…...
RAGS评测后的数据 如何利用influxdb和grafan 进行数据汇总查看
RAGS(通常指相关性、准确性、语法、流畅性)评测后的数据能借助 InfluxDB 存储,再利用 Grafana 进行可视化展示,实现从四个维度查看数据,并详细呈现每个问题对应的这四个指标情况。以下是详细步骤: 1. 环境准备 InfluxDB 安装与配置 依据自身操作系统,从 InfluxDB 官网下…...
本地部署阿里的万象2.1文生视频(Wan2.1-T2V-1.3B)模型
文章目录 (零)在线体验(一)本地部署(1.1)克隆仓库(1.2)安装依赖(1.2.1)安装 flash-attention(1.2.2)重新安装依赖(1.2.3&a…...
centos设置 sh脚本开机自启动
1. start.sh脚本 #!/bin/bash# 依赖docker,等待xxx容器完全启动 sleep 60curl -X POST "localhost:8381/models?urlmymodel.mar&model_namemymodel&batch_size1&max_batch_delay10&initial_workers1"sudo /usr/local/nginx/sbin/nginx …...
一文读懂什么是K8s Admission Controller
#作者:曹付江 文章目录 1、什么是 Admission Controllers?2、如何创建 Admission Controllers?3、Admission 控制器的最佳实践 K8s 中的操作与安全标准执行机制: 1、什么是 Admission Controllers? Admission contro…...
江协科技/江科大-51单片机入门教程——P[1-3] 单片机及开发板介绍
前言:本节主要的任务是了解一下 51 单片机和所用的普中51开发板。 目录 一、单片机介绍 二、单片机的应用领域 三、STC89C52单片机 四、命名规则 五、单片机内部拆解 六、单片机内部结构图 七、单片机管脚图 八、单片机最小系统 九、开发板介绍 十、开发…...
一周学会Flask3 Python Web开发-Jinja2模板继承和include标签使用
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 不管是开发网站还是后台管理系统,我们页面里多多少少有公共的模块。比如博客网站,就有公共的头部&…...
4.3MISC流量分析练习-wireshark-https
流量分析题目的例题 1.了解wireshark的过滤方式 2.了解tls跟ssl协议基本还原 3.了解xor基本变换方式,获取flag 附件是一个流量包,打开之后有各种流量,但是分析无果,然后丢到kali中使用binwalk进行分析,发现有一个r…...
wifi5和wifi6,WiFi 2.4G、5G,五类网线和六类网线,4G和5G的区别
wifi5和wifi6的区别 是Wi-Fi 5和Wi-Fi 6的选择与路由器密切相关。路由器是创建和管理无线网络的设备,它决定了网络的类型和性能。具体来说: 路由器的标准支持:路由器可以支持不同的Wi-Fi标准,如Wi-Fi 5(802.11ac)和Wi-Fi 6(802.11ax)。支持Wi-Fi 6的路由器能够提供更高…...
【二分查找】P9698 [GDCPC2023] Path Planning|普及
本文涉及的基础知识点 本博文代码打包下载 C二分查找 [GDCPC2023] Path Planning 题面翻译 【题目描述】 有一个 n n n 行 m m m 列的网格。网格里的每个格子都写着一个整数,其中第 i i i 行第 j j j 列的格子里写着整数 a i , j a_{i, j} ai,j。从 0…...
请介绍一下Java的面向对象特性
Java是一种纯面向对象的语言,它支持类、继承、封装和多态等面向对象的基本概念。以下是Java面向对象特性的详细介绍: 一、封装 封装是面向对象编程的核心思想之一,它指的是将对象的属性和方法结合在一起,并隐藏对象的内部实现细…...
使用ZFile打造属于自己的私有云系统结合内网穿透实现安全远程访问
文章目录 前言1.关于ZFile2.本地部署ZFile3.ZFile本地访问测试4.ZFile的配置5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定ZFile公网地址 前言 在数字化的今天,我们每个人都是信息的小能手。无论是职场高手、摄影达人还是学习狂人,每天都在创造…...
Spring 源码硬核解析系列专题(八):Spring Security 的认证与授权源码解析
在前几期中,我们从 Spring 核心到 Spring Boot,再到 Spring Cloud,逐步探索了 Spring 生态的底层原理。作为企业级应用的关键组件,Spring Security 提供了全面的安全解决方案,包括认证(Authentication)和授权(Authorization)。本篇将深入 Spring Security 的源码,剖析…...
Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(七)
亮度数据 为了确保用户不会因为切换而注意到亮度变化,GPU0 和 GPU1 显示的所有亮度属性都必须相同。 此要求可确保在切换 GPU0 至 GPU1 之前的任何亮度级别,在切换至 GPU1 后都可以支持。 为此,GPU0 和 GPU1 的驱动程序必须: 使…...
Android ObjectBox数据库使用与集成指南
ObjectBox其核心特点ObjectBox与 SQLite 和 Realm 的对比Android集成ObjectBox创建ObjectBox实体对象创建ObjectBox操作管理类OBManager在Application初始化ObjectBox插入或更新数据查询数据统计数据分页数据查询删除数据总结今天分享一套Android另一个数据库ObjectBox。Object…...
C++ Qt常见面试题(3):Qt内存管理机制
Qt 内存管理机制是其框架的重要组成部分,目的是简化开发者对内存的管理,减少内存泄漏的风险,同时提供高效的资源使用方式。Qt 的内存管理机制主要依赖于 对象树(Object Tree) 和 父子关系(Parent-Child Relationship) 的设计,通过智能管理对象的生命周期来实现自动化的…...
到底什么是认证?
哈喽!欢迎来到程序视点,我是小二哥!本店菜品如下: #风暴过后以桶 认证和授权 什么是认证 认证 (Authentication) 是根据凭据验明访问者身份的流程。即验证“你是你所说的那个人”的过程。 身份认证,通常通过用户名…...
量子计算可能改变世界的四种方式
世界各地的组织和政府正将数十亿美元投入到量子研究与开发中,谷歌、微软和英特尔等公司都在竞相实现量子霸权。 这其中的利害关系重大,有这么多重要的参与者,量子计算机的问世可能指日可待。 为做好准备,,我们必须了…...
【Web安全】图片验证码DOS漏洞
文章目录 免责声明一、漏洞原理二、测试步骤三、测试案例四、修复方式免责声明 在网络安全领域,技术文章应谨慎使用,遵守法律法规,严禁非法网络活动。未经授权,不得利用文中信息进行入侵,造成的任何后果,由使用者自行承担,本文作者不负责。提供的工具仅限学习使用,严禁…...
鸿蒙Next如何自定义标签页
前言 项目需求是展示标签,标签的个数不定,一行展示不行就自行换行。但是,使用鸿蒙原生的 Grid 后发现特别的难看。然后就想着自定义控件。找了官方文档,发现2个重要的实现方法,但是,官方的demo中讲的很少&…...
一周学会Flask3 Python Web开发-Jinja2模板过滤器使用
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在Jinja2中,过滤器(filter)是一些可以用来修改和过滤变量值的特殊函数,过滤器和变量用一个竖线 | &a…...
HarmonyOS 5.0应用开发——鸿蒙接入高德地图实现POI搜索
【高心星出品】 文章目录 鸿蒙接入高德地图实现POI搜索运行结果:准备地图编写ArkUI布局来加载HTML地图 鸿蒙接入高德地图实现POI搜索 在当今数字化时代,地图应用已成为移动设备中不可或缺的一部分。随着鸿蒙系统的日益普及,如何在鸿蒙应用中…...
浅谈HTTP及HTTPS协议
1.什么是HTTP? HTTP全称是超文本传输协议,是一种基于TCP协议的应用非常广泛的应用层协议。 1.1常见应用场景 一.浏览器与服务器之间的交互。 二.手机和服务器之间通信。 三。多个服务器之间的通信。 2.HTTP请求详解 2.1请求报文格式 我们首先看一下…...
内存泄漏指什么?常见的内存泄漏有哪些?
内存泄漏是指程序在运行过程中,由于某些原因导致程序无法释放已经不再使用的内存,使得这部分内存持续被占用,最终可能导致系统可用内存逐渐减少,严重时会影响系统性能甚至导致程序崩溃。(内存泄漏是指程序中已经分配的…...
FFmpeg视频处理入门级教程
一、FFmpeg常规处理流程 #mermaid-svg-W8X1llNEyuYptV3I {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-W8X1llNEyuYptV3I .error-icon{fill:#552222;}#mermaid-svg-W8X1llNEyuYptV3I .error-text{fill:#552222;str…...
PINN求解固体力学问题——论文加代码
PINN求解固体力学问题——论文加代码 1. 训练2. 可视化 论文:Physics-Informed Deep Learning and its Application in Computational Solid and Fluid Mechanics 1. 训练 # %load Plane_Stress_W-PINNs.py """ Forward Problem for Plane Stress …...
HC32F460_SCI驱动(一)
在开始介绍HC32F460的SCI驱动之前,先重点说明一下功能组与串口相关参数,以便于更好的描述SCI驱动。 1. 功能组 1.1 基本概念 HC32F460的引脚功能复用机制通过Func_Grp(功能组)实现,其灵活性显著高于传统单片机(如STM32系列)。每个引脚支持多种外设功能,具体功能通过选…...
程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 这一节我们来学习指针的相关知识,学习内存和地址,指针变量和地址,包…...
QT:QPen、QBrush、与图形抗锯齿的关联
QPen QPen 是 Qt 框架中用于定义绘图时使用的画笔属性的类。在使用 QPainter 进行 2D 绘图时,QPen 可以控制线条的外观,比如线条的颜色、宽度、样式(如实线、虚线等)、端点样式(如方形端点、圆形端点等)和…...
数据结构秘籍(一)线性数据结构
1.数组 数组(Array)是一种很常见的数据结构。它由相同类型的元素(element)组成,并且是使用一块连续的内存来存储。 我们直接可以利用元素的索引(index)计算出该元素对应的存储地址。 数组的特…...
【数据分享】2000-2024年全国逐年归一化植被指数(NDVI)栅格数据(年平均值)
NDVI,全名为Normalized Difference Vegetation Index,中文名称为归一化植被指数。这个指数可以用来定性和定量评价植被覆盖及其生长活力,我们也可以简单地将它理解为体现植被密度和健康状况的一个指标。 之前我们给大家分享了来源于MOD13A3数…...
解决前端计算的浮点精度问题
问题:比如1001*1.11等于110.11 但是如果用前端开发处理的话 ,因为涉及到浮点数运算(这是因为JavaScript(以及其他许多编程语言)使用IEEE 754标准来表示浮点数,导致某些十进制小数无法精确表示,…...
C语言基本知识------指针(4)
1. 回调函数是什么? 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。 void qsort(void base,//指针…...
004 Kafka异常处理
6.异常处理 文章目录 6.异常处理1.异常分类与处理原则2.生产者异常处理1. 同步发送捕获异常2. 异步发送回调处理 3.消费者异常处理1.全局异常处理器2.方法级处理3.重试yml配置 4.死信队列(DLQ)配置1. 启用死信队列2. 手动发送到DLQ 5.事务场景异常处理1.…...
C++模拟实现map和set
C模拟实现map和set 1、STL源代码分析2、实现出复用红黑树的框架3、实现红黑树的迭代器4、解决map和set中key不可修改问题5、解决insert返回值问题完整代码 模拟实现map和set实际上是对红黑树的封装,如对红黑树的实现有疑问,请移步:C手撕红黑树…...
使用elasticdump导出/导入 -- ES数据
导出指定索引数据到指定文件夹: ./elasticdump --inputhttp://用户:密码IP:9201/索引名字 --output导出路径/out.json --typedata 将导出的文件导入 ./elasticdump --input路径/out.json --outputhttp://账号:密码IP:9201/索引名称 --typedata --fileTypejson 【el…...
CSDN年度评选揭晓,永洪科技AI技术与智能应用双星闪耀
近日,永洪科技在CSDN(中国专业开发者社区)的年度评选中,凭借在人工智能技术创新与vividime在行业应用中的卓越表现,一举斩获“人工智能企业”及“智能应用”双料大奖。这一荣誉不仅彰显了永洪科技在AI领域的领先地位&a…...
Kubernetes 资源利用率翻倍?离在线混合部署深度解析
还在为 Kubernetes 集群资源利用率低而烦恼?还在为高昂的云成本而头疼?今天,我们就来聊聊 Kubernetes 中的一项黑科技——离在线混合部署,让大家的集群资源利用率翻倍,成本减半! 🤔 什么是离在线…...
【Java】Spring Boot全量YAML配置说明
目录 Spring Boot 配置文件基础核心配置日志配置Web 服务器配置数据源配置JPA 配置缓存配置国际化配置邮件服务配置自定义配置使用示例1. Spring Boot 配置文件基础 Spring Boot 的配置文件可以使用以下文件格式: application.propertiesapplication.ymlSpring Boot 默认加载…...
【STL】7.STL常用算法(1)
STL常用算法(1) 前言简介一.遍历算法1.for_each2.transform 二.查找算法1.find2.find_if3.adjacent_find4.binary_search5.count6.cout_if 三.排序算法1.sort2.random_shuffle3.merge4.reverse 总结 前言 stl系列主要讲述有关stl的文章,使用S…...
弱监督语义分割学习计划(1)-简单实现CAM但是效果不好
零: 项目说明 是这样的一个事情,经过与deepseek的一番讨论和交流,DeepSeek为我设计了一个30天高强度学习计划,重点聚焦弱监督/无监督语义分割在野外场景的应用,结合理论与实践,并最终导向可落地的开源项目。目前开始了…...
内存泄漏问题分享
在前端开发中,内存泄漏(Memory Leak)是指由于代码问题导致浏览器无法回收不再使用的内存,从而影响网页的性能,导致页面变慢,甚至崩溃。前端内存泄漏通常由以下几种原因引起,理解和修复这些问题对…...
用 DeepSeek 打样!KubeSphere LuBan 用 3 天/3 分钟“干掉”大模型部署焦虑
用 DeepSeek 打样!KubeSphere LuBan 用 3 天/3 分钟“干掉”大模型部署焦虑 大模型落地,如何告别“部署焦虑”? DeepSeek-R1 的惊艳表现无需赘述,但企业落地时的高门槛却让许多开发者望而却步——复杂的部署流程、资源调度难题、…...
Java在云计算平台中的应用研究
Java在云计算平台中的应用研究 随着云计算的广泛应用,越来越多的企业和开发者开始选择基于云计算的架构来构建和部署应用。Java作为一种成熟的编程语言,凭借其跨平台性、强大的生态系统以及优秀的并发处理能力,已成为云计算平台中常用的编程…...