当前位置: 首页 > article >正文

从零开始的嵌入式学习day33

网络编程及相关概念
UDP网络通信程序
UDP网络通信操作
一、网络编程及相关概念
1. 网络编程概念:
        指通过计算机网络实现程序间通信的技术,涉及协议、套接字、数据传输等核心概念。常见的应用场景包括客户端-服务器模型、分布式系统、实时通信等。

2.OSI模型概述及结构
        1)概述:OSI(Open Systems Interconnection)模型是一种用于描述网络通信过程的标准化框架,由国际标准化组织(ISO)于1984年提出。它将网络通信划分为7个层次,每一层负责特定的功能,并通过接口与相邻层交互。

        2)OSI模型的七层结构

        物理层(Physical Layer)负责传输原始比特流,定义物理介质(如电缆、光纤)的电气、机械特性。典型协议包括以太网、USB。

        数据链路层(Data Link Layer)将比特流组织为帧(Frame),提供物理地址(MAC地址)和错误检测。交换机在此层操作,协议如PPP、HDLC。

        网络层(Network Layer)负责路由选择和数据包转发,使用逻辑地址(如IP地址)。核心设备是路由器,协议包括IP、ICMP。

        传输层(Transport Layer)确保端到端的可靠传输,提供流量控制和错误恢复。主要协议有TCP(可靠)和UDP(不可靠)。

       会话层(Session Layer)  管理通信会话的建立、维护和终止,例如NetBIOS。

       表示层(Presentation Layer)处理数据格式转换(如加密、压缩),确保应用层可理解数据。例如SSL/TLS加密。

       应用层(Application Layer)直接为用户应用提供服务,协议包括HTTP、FTP、SMTP。

3.TCP/IP模型概述及结构
        1)概述:TCP/IP模型是互联网通信的核心框架,由四层组成:网络接口层、网络层、传输层和应用层。它比OSI七层模型更简洁,实际应用更广泛。

        2)TCP/IP模型的四层结构:

        网络接口层(Link Layer)负责物理传输,包括以太网、Wi-Fi等协议。数据以帧为单位传输,处理MAC地址和硬件交互。

        网络层(Internet Layer) 核心协议为IP(Internet Protocol),负责路由和逻辑寻址。关键协议包括:

IP:无连接的数据包传输
ICMP:错误报告和诊断(如ping)
ARP:IP地址到MAC地址的映射
        传输层(Transport Layer)提供端到端通信,主要协议:TCP(可靠连接,三次握手建立连接)、UDP(无连接,低延迟)。

        应用层(Application Layer)包含高层协议如HTTP、FTP、DNS等。数据单位为消息。

        3)数据封装过程:发送端自上而下封装------接收端自下而上解封装

应用数据添加应用层头(如HTTP头)
传输层添加TCP/UDP头
网络层添加IP头
网络接口层添加帧头和尾

4.OSI模型与TCP/IP模型对比
TCP/IP层OSI层
应用层应用层+表示层+会话层
传输层传输层
网络层网络层
网络接口层数据链路层+物理层

实际应用要点
IP地址分为IPv4(32位)和IPv6(128位)
端口号范围:0-65535(系统端口:0-1023)
MTU(最大传输单元)影响数据分片
路由选择通过路由表实现
该模型的设计强调端到端原则,将复杂性放在网络边缘,核心网络保持简单高效。

5.DNS域名解析原理
        DNS(Domain Name System)将人类可读的域名(如example.com)转换为机器可读的IP地址(如93.184.216.34)。解析过程遵循分层查询机制:

        1)递归查询:用户设备向递归DNS服务器(如ISP提供的服务器)发起请求,由递归服务器完成后续查询并返回最终结果。
        2)迭代查询:递归服务器依次向根域名服务器、顶级域(TLD)服务器和权威域名服务器查询,最终获取目标IP。

6.DHCP概述及工作原理
        1)概述:DHCP(Dynamic Host Configuration Protocol)是一种网络协议,用于自动分配 IP 地址、子网掩码、默认网关和其他网络配置参数给客户端设备。它简化了网络管理,避免了手动配置 IP 地址的繁琐和错误。

        2)DHCP工作原理:DHCP 使用客户端-服务器模型,工作流程分为四个阶段(DHCPDISCOVER、DHCPOFFER、DHCPREQUEST、DHCPACK):

DHCPDISCOVER:客户端广播请求 IP 地址配置。

DHCPOFFER:服务器响应并提供可用 IP 地址。

DHCPREQUEST:客户端确认选择服务器提供的配置。

DHCPACK:服务器最终确认分配 IP 地址。

7.IPv4地址分类

        IPv4地址通常分为A、B、C、D、E五类,主要依据网络号和主机号的划分方式:

  1. A类地址:
  • 范围:1.0.0.0 到 126.255.255.255
  • 第一字节为网络号,后三个字节为主机号。
  • 子网掩码:255.0.0.0
  • 适用于大型网络,如国际组织或大型企业。

 2.B类地址:

  • 范围:128.0.0.0 到 191.255.255.255
  • 前两个字节为网络号,后两个字节为主机号。
  • 子网掩码:255.255.0.0
  • 适用于中型网络,如大学或中型企业。

 3.C类地址:

  • 范围:192.0.0.0 到 223.255.255.255
  • 前三个字节为网络号,最后一个字节为主机号。
  • 子网掩码:255.255.255.0
  • 适用于小型网络,如家庭或小型办公室。

   4.D类地址:

  • 范围:224.0.0.0 到 239.255.255.255(网络号+最大主机号)
  • 用于组播(Multicast)通信,不划分网络号和主机号。
  • 主要用于视频流、在线会议等一对多的通信场景。

     5.E类地址:

  • 范围:240.0.0.0 到 255.255.255.255
  • 保留用于实验和研究,不用于常规网络通信。

8.单机上网配置
        1、有网络接口并插入网线。
        2、有ip地址
        3、配置网络设置

ip: ifconfig ethX X.X.X.X/24 up  ifconfig ens33 192.168.0.13/24 up  255.255.255.0
网关: route add default gw x.x.x.x 
DNS:  vi /etc/resolv.conf  ==>nameserver 8.8.8.8
测试:ping www.baidu.com  

netstat  -anp:查看网络连接状态

网络接口:
        1、socket  套接字 ==》BSD socket ==》用于网络通信的一组接口函数。

                socket api  application interface
        2、ip+port 地址+端口===》地址用来识别主机、端口用来识别应用程序。
                  port分为TCP port / UDP port  范围都是: 1-65535,约定1000 以内的端口为系统使用。

网络字节序 :大端存储

用htons函数 把端号转为大端。

用inet addr 函数把IP地址转为大端。

9.私有IP地址和公有IP地址

        1)私有IP:用于局域网内部通信,不直接暴露在互联网上。

范围包括:
A类:10.0.0.0 到 10.255.255.255
B类:172.16.0.0 到 172.31.255.255
C类:192.168.0.0 到 192.168.255.255
通常通过NAT(网络地址转换)与公网通信。

  2)公有IP:用于互联网通信,全球唯一。

        除私有IP和特殊保留地址外的其他IPv4地址

二、UDP网络通信程序
1.UDP概述
        UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,提供简单的、不可靠的数据传输服务。与 TCP 不同,UDP 不保证数据包的顺序、可靠性或流量控制,但具有低延迟和高效率的特点。

2.UDP特征
无连接:通信前无需建立连接,直接发送数据。
不可靠:不保证数据包是否到达目的地,也不保证顺序。
高效:头部开销小(仅 8 字节),适合对延迟敏感的应用。
支持广播和多播:可以同时向多个目标发送数据。
3.UDP头部结构
         UDP 头部包含 4 个字段,每个字段 2 字节:

        1)源端口(Source Port):发送方端口号(可选,可设为 0)。

        2)目标端口(Destination Port):接收方端口号。

        3)长度(Length):UDP 头部加数据的总长度(最小为 8)。

        4)校验和(Checksum):用于错误检测(可选,IPv6 必须校验)。

4.UDP适用场景:
实时应用:如视频流、语音通话(VoIP)、在线游戏。
DNS 查询:快速响应比可靠性更重要。
广播/多播:如 DHCP、网络发现协议。
简单请求-响应:如 SNMP、TFTP。
5.UDP与TCP对比:
特性    UDP    TCP
连接方式    无连接    面向连接
可靠性    不可靠    可靠(重传、确认机制)
流量控制    无    有(滑动窗口)
顺序保障    不保证    保证
头部大小    8 字节    20 字节
适用场景    实时、低延迟应用    文件传输、网页浏览
UDP 的局限性:
无拥塞控制:可能引发网络拥塞。
数据包丢失:不适合需要高可靠性的场景。
安全性:容易受到 DDOS 攻击(如 UDP 洪水攻击)。

三、UDP网络通信操作

1.socket():创建套接字,返回文件描述符。

#include <sys/socket.h>

int socket(int domain, int type, int protocol);

        参数:domain:协议族(如AF_INET IPv4,AF_INET6 IPv6)。

                        参数:PF_INET == AF_INET ==>互联网程序
                                  PF_UNIX == AF_UNIX ==>单机程序

                type:套接字类型(如SOCK_STREAM TCP,SOCK_DGRAM UDP)。
                           SOCK_STREAM  流式套接字 ===》TCP   
                          SOCK_DGRAM   用户数据报套接字===>UDP
                          SOCK_RAW     原始套接字  ===》IP
                protocol 协议 ==》0 表示自动适应应用层协议。通常为0,自动匹配。

2.bind():将套接字绑定到特定IP和端口。

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

        参数:

sockfd:socket()返回的文件描述符。
addr:指向sockaddr结构的指针(需转换为struct sockaddr_in或sockaddr_in6)。
struct sockaddr      通用地址结构
  {
  u_short sa_family;  地址族
  char sa_data[14];   地址信息
  };

转换成网络地址结构如下:
  struct _sockaddr_in    ///网络地址结构
  {
  u_short    sin_family; 地址族
  u_short    sin_port;   ///地址端口
  struct in_addr  sin_addr;   ///地址IP
  char    sin_zero[8]; 占位
  };

addrlen:地址结构长度。
        注意:如果是客户端,则该函数省略,由默认接口发送数据。

3.recvfrom():用于从套接字接收数据的系统调用,常用于无连接协议(如UDP)。与recv不同,recvfrom可以获取发送端的地址信息。

#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                 struct sockaddr *src_addr, socklen_t *addrlen);

        参数:

sockfd: 套接字描述符
buf: 接收数据的缓冲区指针
len: 缓冲区长度
flags: 控制标志(常用值如MSG_WAITALL、MSG_DONTWAIT)
src_addr: 发送方地址结构体指针(可为NULL)
addrlen: 地址结构体长度指针(输入输出参数)
        返回值:

成功时返回接收的字节数
失败返回-1并设置errno
连接关闭时返回0
4.sendto():用于发送数据的系统调用,用于无连接协议(UDP)或需要指定目标地址的场景。它允许直接向特定目标发送数据而不需要预先建立连接。

#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
               const struct sockaddr *dest_addr, socklen_t addrlen);

        参数:

sockfd: 已创建的套接字文件描述符
buf: 指向包含待发送数据的缓冲区
len: 要发送的数据长度(字节数)
flags: 控制发送行为的标志位(通常为0)
dest_addr: 指向目标地址结构体的指针
addrlen: 目标地址结构体的长度
        返回值:成功时返回发送的字节数,失败返回-1并设置errno。

示例:用UDP完成现在实时聊天

服务器端:

#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <time.h>
#include <unistd.h>
typedef struct sockaddr *(SA);
int main(int argc, char *argv[]) {int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd) {perror("socket");return 1;}struct sockaddr_in ser, cli; // client  man 7 ipbzero(&ser, sizeof(ser));bzero(&cli, sizeof(cli));ser.sin_family = AF_INET;ser.sin_port = htons(50000);             // host to net shortser.sin_addr.s_addr = htonl(INADDR_ANY); // 小端转大端  本地回环  127int ret = bind(sockfd, (SA)&ser, sizeof(ser));if (-1 == ret) {perror("bind");return 1;}socklen_t len = sizeof(cli);char buf[256] = {0};recvfrom(sockfd, buf, sizeof(buf), 0, (SA)&cli, &len);pid_t pid = fork();if (pid > 0) {while (1) {char buf[256] = {0};recvfrom(sockfd, buf, sizeof(buf), 0, (SA)&cli, &len);if (0 == strcmp(buf, "#quit\n")) {kill(pid, 9);exit(0);}printf("cli:%s", buf);fflush(stdout);}} else if (0 == pid) {while (1) {char buf[256] = {0};printf("to cli:");fgets(buf, sizeof(buf), stdin);sendto(sockfd, buf, strlen(buf), 0, (SA)&cli, sizeof(cli));if (0 == strcmp(buf, "#quit\n")) {kill(getppid(), 9);exit(0);}}} else {perror("fork");return 1;}return 0;
}

客户端: 

 

#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <time.h>
#include <unistd.h>
typedef struct sockaddr *(SA);
int main(int argc, char *argv[]) {int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd) {perror("socket");return 1;}struct sockaddr_in ser, cli; // client  man 7 ipbzero(&ser, sizeof(ser));bzero(&cli, sizeof(cli));ser.sin_family = AF_INET;ser.sin_port = htons(50000);                      // host to net shortser.sin_addr.s_addr = inet_addr("192.168.0.165"); // 小端转大端socklen_t len = sizeof(cli);char buf[256] = {0};strcpy(buf, "start");sendto(sockfd, buf, strlen(buf), 0, (SA)&ser, sizeof(ser));pid_t pid = fork();if (pid > 0) {while (1) {char buf[256] = {0};recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL);if (0 == strcmp(buf, "#quit\n")) {kill(pid, 9);exit(0);}printf("ser:%s", buf);fflush(stdout);}} else if (0 == pid) {while (1) {char buf[256] = {0};printf("to ser:");fgets(buf, sizeof(buf), stdin);sendto(sockfd, buf, strlen(buf), 0, (SA)&ser, sizeof(ser));if (0 == strcmp(buf, "#quit\n")) {kill(getppid(), 9);exit(0);}}} else {perror("fork");return 1;}close(sockfd);return 0;
}

相关文章:

从零开始的嵌入式学习day33

网络编程及相关概念 UDP网络通信程序 UDP网络通信操作 一、网络编程及相关概念 1. 网络编程概念&#xff1a; 指通过计算机网络实现程序间通信的技术&#xff0c;涉及协议、套接字、数据传输等核心概念。常见的应用场景包括客户端-服务器模型、分布式系统、实时通信等。…...

ArcGIS Pro 3.4 二次开发 - 宗地

环境:ArcGIS Pro SDK 3.4 + .NET 8 文章目录 宗地1 宗地1.1 向地图添加宗地图层1.2 获取活动记录1.3 设置活动记录1.4 创建新记录1.5 将标准线要素复制到宗地类型1.6 将宗地线复制到宗地类型1.7 将要素分配给活动记录1.8 创建宗地种子1.9 构建地块1.10 重复地块1.11 设置地块为…...

前端面试准备-7

1.定义class的实现 //定义class class Person{//公有属性nameage 18//构造函数constructor(name){//构造函数内部的this实例化对象this.name name//动态添加属性&#xff08;不推荐&#xff09;this.food [&#x1f402;,&#x1f40e;,&#x1f40f;]}//公有方法sayHi(){c…...

黑马Java面试笔记之框架篇(Spring、SpringMvc、Springboot)

一. 单例bean Spring框架中的单例bean是线程安全的吗&#xff1f; Spring框架中的bean是单例的&#xff0c;可以在注解Scope()进行设置 singleton&#xff1a;bean在每一个Spring IOC容器中只有一个实例。prototype&#xff1a;一个bean的定义可以有多个实例 总结 二. AOP AOP称…...

全球IP归属地查询接口如何用C#进行调用?

一、什么是全球IP归属地查询接口 在全球化互联网时代&#xff0c;IP地址作为网络世界的地理位置标识&#xff0c;扮演着至关重要的角色。全球IP归属地查询接口通过解析IP地址&#xff0c;提供包括国家、省、市、区县和运营商在内的详细信息。 二、应用场景 1. 访问识别 全球…...

NumPy 比较、掩码与布尔逻辑

文章目录 比较、掩码与布尔逻辑示例&#xff1a;统计下雨天数作为通用函数&#xff08;Ufuncs&#xff09;的比较运算符使用布尔数组计数条目布尔运算符 布尔数组作为掩码使用关键字 and/or 与运算符 &/| 的区别 比较、掩码与布尔逻辑 本文介绍如何使用布尔掩码来检查和操…...

力扣HOT100之二分查找:35. 搜索插入位置

这道题属于是二分查找的入门题了&#xff0c;我依稀记得一些二分查找的编码要点&#xff0c;但是最后还是写出了一个死循环&#xff0c;无语(ˉ▽ˉ&#xff1b;)…又回去看了下自己当时的博客和卡哥的视频&#xff0c;这才发现自己分情况只分了两种&#xff0c;最后导致死循环…...

使用API有效率地管理Dynadot域名,查看域名市场中所售域名的详细信息

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…...

IM即时通讯软件,构建企业局域网内安全协作

安全与权限&#xff1a;协同办公的企业级保障 在协同办公场景中&#xff0c;BeeWorks 将安全机制贯穿全流程。文件在局域网内传输与存储时均采用加密处理&#xff0c;企业网盘支持水印预览、离线文档权限回收等功能&#xff0c;防止敏感资料外泄&#xff1b;多人在线编辑文档时…...

VueScan:全能扫描,高清输出

在数字化办公和图像处理的领域&#xff0c;扫描仪扮演着不可或缺的角色。无论是文档的数字化存档、照片的高清复制&#xff0c;还是创意项目的素材采集&#xff0c;一款性能卓越、操作便捷的扫描软件能大幅提升工作效率和成果质量。VueScan正是这样一款集多功能于一身的扫描仪软…...

PyCharm项目和文件运行时使用conda环境的教程

打开【文件】—【新建项目】 按照下图配置环境 可以看到我这个项目里&#xff0c;报错“No module named modelscope” 点击终端&#xff0c;输入命令 #显示所有的conda环境 conda env list #选择需要激活的conda环境 conda activate XXX在终端中&#xff0c;执行pip install …...

第八部分:第五节 - 生命周期与副作用 (`useEffect` Hook):组件的幕后工作

知识点&#xff1a; 组件生命周期&#xff08;挂载 Mounting, 更新 Updating, 卸载 Unmounting - 高级概念&#xff09;&#xff0c;副作用 (Side Effects)&#xff0c;useEffect Hook (用于处理副作用&#xff0c;如数据获取、订阅、DOM 操作)&#xff0c;useEffect 的依赖数组…...

docker 搭建php 开发环境 添加扩展redis、swoole、xdebug(2)

3、创建compose 的yml文件 version: "3.9" services:#配置nginxnginx:#镜像名称 nginx:latestimage: nginx#自定义容器的名称#container_name: c_nginxports:- "80:80"#lnmp目录和容器的/usr/share/nginx/html目录进行绑定,设置rw权限#将宿主机的~/lnmp/…...

DeepSwiftSeek 开源软件 |用于 DeepSeek LLM 模型的 Swift 客户端 |轻量级和高效的 DeepSeek 核心功能通信

​一、软件介绍 文末提供程序和源码下载 DeepSeek Swift SDK 是一个轻量级且高效的基于 Swift 的客户端&#xff0c;用于与 DeepSeek API 进行交互。它支持聊天消息完成、流式处理、错误处理以及使用高级参数配置 DeepSeekLLM。 二、Features 特征 Supports chat completion …...

Flask-Login使用示例

项目结构 首先创建以下文件结构&#xff1a; flask_login_use/ ├── app.py ├── models.py ├── requirements.txt └── templates/├── base.html├── index.html├── login.html├── register.html└── profile.html1. requirements.txt Flask2.3.3 Fl…...

React Hooks 基础指南

React Hooks 是 React 16.8 引入的重要特性&#xff0c;它允许开发者在函数组件中使用状态和其他 React 特性。本文将详细介绍 6 个最常用的 React Hooks。 1. useState useState 是最常用的 Hook&#xff0c;用于在函数组件中添加 state。 import React, { useState } from…...

web第九次课后作业--SpringBoot基于mybatis实现对数据库的操作

前言 在前面我们学习MySQL数据库时&#xff0c;都是利用图形化客户端工具(如&#xff1a;idea、datagrip)&#xff0c;来操作数据库的。 在客户端工具中&#xff0c;编写增删改查的SQL语句&#xff0c;发给MySQL数据库管理系统&#xff0c;由数据库管理系统执行SQL语句并返回执…...

沪铜6月想法

市场回顾 2025年5月&#xff0c;沪铜期货主力合约价格整体呈现震荡走势。从月初到月末&#xff0c;价格在7.67-7.82万元/吨之间波动。截至5月31日&#xff0c;沪铜主力合约收盘价为7.76万元/吨。本月铜价围绕供需基本面和宏观政策预期展开波动&#xff0c;尤其在5月14日至5月1…...

网络通信核心概念全解析:从IP地址到TCP/UDP实战

一、网络基础架构三要素 1. IP地址&#xff1a;互联网的“门牌号” 本质&#xff1a;32位整数标识主机位置&#xff08;IPv4&#xff09;表示法&#xff1a;点分十进制&#xff08;如 192.168.1.1&#xff09;功能&#xff1a;全球唯一标识网络设备特殊地址&#xff1a; 127.…...

Spring 中的disposableBean介绍

在 Spring 框架中&#xff0c;DisposableBean 是一个接口&#xff0c;用于定义 Bean 在被销毁前需要执行的清理逻辑。它是 Spring 容器生命周期回调机制的一部分。 &#x1f331; 什么是 DisposableBean DisposableBean 接口是 Spring 提供的一个标准接口&#xff0c;用于通知…...

【Linux命令学习】获取cpu信息 - lscpu命令学习

lscpu命令显示的是服务器cpu架构相关信息&#xff0c;lscpu从伪文件系统(sysfs)、/proc/cpuinfo和任何可用的特定体系架构库中收集cpu架构信息。输出内容包括&#xff1a;CPU、线程、内核的数量以及非同一存储器存取节点。此外还包括关于CPU高速缓存和高速缓存共享的信息&#…...

wordpress免费主题网站

这是一款WordPress主题&#xff0c;由jianzhanpress开发&#xff0c;可以免费下载。专为中小微企业设计&#xff0c;提供专业的网站建设、网站运营维护、网站托管和网站优化等服务。主题设计简约、现代&#xff0c;适合多种行业需求。 主要特点&#xff1a; 多样化展示&#…...

Go中的协程并发和并发panic处理

1 协程基础 1.1 协程定义&#xff08;Goroutine&#xff09; 概念&#xff1a;Go 语言特有的轻量级线程&#xff0c;由 Go 运行时&#xff08;runtime&#xff09;管理&#xff0c;相比系统线程&#xff08;Thread&#xff09;&#xff0c;创建和销毁成本极低&#xff0c;占用…...

Qt Creator工具编译器配置

1、打开Qt Creator&#xff0c;工具-->选项 2、选择"编译器"&#xff0c;Manual配置编译器。 初始化填入“C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\cl.exe”&#xff0c;选择64位amd64。 ABI根据msvc版本进行选择msvc2015. 3、新建项目…...

从零开始的数据结构教程(六) 贪心算法

&#x1f36c; 标题一&#xff1a;贪心核心思想——发糖果时的最优分配策略 贪心算法 (Greedy Algorithm) 是一种简单直观的算法策略。它在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望得到一个全局最优解。这就像你…...

Spring框架学习day7--SpringWeb学习(概念与搭建配置)

SpringWeb1.SpringWeb特点2.SpringWeb运行流程3.SpringWeb组件4.搭建项目结构图&#xff1a;4.1导入jar包4.2在Web.xml配置**4.2.1配置统一拦截分发器 DispatcherServlet**4.2.2开启SpringWeb注解&#xff08;spring.xml&#xff09; 5.处理类的搭建6.SpringWeb请求流程(自己理…...

打造高效多模态RAG系统:原理与评测方法详解

引言 随着信息检索与生成式AI的深度融合&#xff0c;检索增强生成&#xff08;RAG, Retrieval-Augmented Generation&#xff09; 已成为AI领域的重要技术方向。传统RAG系统主要依赖文本数据&#xff0c;但真实世界中的信息往往包含图像、表格等多模态内容。多模态RAG&#xf…...

SSM 框架核心知识详解(Spring + SpringMVC + MyBatis)

&#x1f331; 第一部分&#xff1a;Spring 核心原理与使用 1. 什么是 Spring Spring 是一个开源的 Java 企业级开发框架&#xff0c;旨在简化 Java 企业应用程序开发。它核心思想是控制反转&#xff08;IoC&#xff09;和面向切面编程&#xff08;AOP&#xff09;&#xff0…...

1.2 fetch详解

浏览器 Fetch API 详解 Fetch API 是现代浏览器提供的用于发起网络请求的接口&#xff0c;它基于 Promise 实现&#xff0c;替代了传统的 XMLHttpRequest&#xff0c;提供了更强大、更灵活的功能。 1. 基本用法 使用 fetch() 函数发起请求&#xff0c;返回一个 Promise&…...

【C#】Quartz.NET怎么动态调用方法,并且根据指定时间周期执行,动态配置类何方法以及Cron表达式,有请DeepSeek

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01;&#…...