【Linux网络】——Socket网络编程
前言
在当今数字化的时代,网络通信已经成为计算机领域不可或缺的一部分。无论是日常的网页浏览、社交媒体交互,还是大规模的企业级数据传输,都离不开高效可靠的网络通信。而在Linux操作系统中,Socket网络编程是实现各种网络应用的基础技术。通过使用Socket编程,开发人员可以在不同的计算机之间建立连接,实现数据的发送和接收,为各种网络应用程序的开发和部署提供了强大的支持。
Socket网络编程
基本概念
Socket是一种用于在网络中传输数据的抽象接口。它定义了应用程序与网络操作系统之间的通信接口,允许应用程序通过网络进行数据交换。Socket可以看作是一个通信的端点,包含了IP地址和端口号。
ip地址
- 标识网络中设备唯一身份的数字标签。
- 在IPv4中,IP地址由32位二进制数表示,通常以点分十进制表示法表示,如192.168.1.1。而在IPv6中,IP地址由128位二进制数表示,采用冒号十六进制表示法。
端口号
- 端口号用于标识网络应用程序在同一台计算机上的不同连接。
- 端口号由16位无符号整数表示,范围从0到65535。端口0到1023是系统保留端口,通常用于特定的服务,如HTTP(80)、FTP(21)等。自定义应用程序通常使用1024以上的端口号。
IP地址和端口号互相配合,IP地址负责找到唯一的一台网络设备,端口号负责找到这台设备上的唯一连接,就组成了唯一的一个地址,让数据有了起点和终点
Socket网络编程接口
理解了Socket编程所需的基本概念,接下来,就需要看看其接口
创建套接字——socket
在开始网络通信之前,需要创建一个套接字。
在Linux中,通过调用socket()
系统调用来创建套接字。
函数造型:
int socket(int domain, int type, int protocol);
参数说明:
domain
:地址族,常用的有AF_INET
(IPv4)、AF_INET6
(IPv6)。type
:套接字类型,如SOCK_STREAM(TCP协议)
、SOCK_DGRAM(UDP协议)
。protocol
:协议类型,通常设为0,表示默认协议。
返回值说明:
- 成功时返回一个非负整数,表示Socket描述符。
- 失败时返回
-1
,并设置errno
。
绑定套接字——bind
将Socket绑定到一个特定的IP地址和端口。
绑定地址后,该套接字相当于在网络中有了唯一性,这些必不可少的一环
函数造型
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数说明
sockfd
: Socket描述符。addr
: 指向包含IP地址和端口信息的sockaddr
结构体。addrlen
:addr
结构体的大小。
返回值说明
- 成功时返回
0
。 - 失败时返回
-1
,并设置errno
。
sockaddr结构体
单独将sockaddr结构体拎出来讲一下
在Linux的Socket编程中,sockaddr
结构体是一个通用的地址结构体,用于表示网络地址信息。
它的基本形式如下:
struct sockaddr {sa_family_t sa_family; // 地址族 (Address family)char sa_data[14]; // 协议地址 (Protocol address)
};
成员说明:
-
sa_family
: 地址族,表示地址的类型。常用的值包括:AF_INET
: IPv4 地址族AF_INET6
: IPv6 地址族AF_UNIX
: Unix 域套接字(用于本地进程间通信)- 其他地址族(如
AF_PACKET
用于原始套接字等)
-
sa_data
: 这是一个14字节的数组,用于存储具体的协议地址信息。对于不同的地址族,sa_data
中存储的内容不同。例如,对于AF_INET
,sa_data
包含IP地址和端口号。
不过,sockaddr
是一个通用的结构体,实际使用时通常会使用更具体的结构体,如 sockaddr_in
(用于IPv4)或 sockaddr_in6
(用于IPv6)。
sockaddr_in
结构体(用于IPv4)
在实际编程中,sockaddr_in
结构体更常用于表示IPv4地址信息。它是对 sockaddr
的扩展,提供了更明确的字段来表示IPv4地址和端口。
基本样式
struct sockaddr_in {sa_family_t sin_family; // 地址族,必须是 AF_INETin_port_t sin_port; // 端口号,使用网络字节序(大端)struct in_addr sin_addr; // IP地址,使用网络字节序char sin_zero[8]; // 填充字段,与 `sockaddr` 的大小对齐
};
成员说明:
-
sin_family
: 地址族,必须设置为AF_INET
。 -
sin_port
: 端口号,使用网络字节序(大端)。可以使用htons()
函数将主机字节序转换为网络字节序。 -
sin_addr
: IP地址,使用in_addr
结构体表示。in_addr
结构体内部只有一个成员s_addr用来存储IP地址
-
sin_zero
: 这是一个8字节的填充字段,用于与sockaddr
结构体的大小对齐。通常设置为0。
sockaddr_in6
结构体(用于IPv6)
对于IPv6地址,可以使用 sockaddr_in6
结构体
基本样式:
struct sockaddr_in6 {sa_family_t sin6_family; // 地址族,必须是 AF_INET6in_port_t sin6_port; // 端口号,使用网络字节序uint32_t sin6_flowinfo; // IPv6流信息struct in6_addr sin6_addr; // IPv6地址uint32_t sin6_scope_id; // 作用域ID(用于链路本地地址)
};
关于sockaddr_in6我们不过多介绍,因为实际socket中基本不使用,很难见到
监听套接字——listen
将Socket设置为监听状态,等待客户端的连接请求。
基本样式
int listen(int sockfd, int backlog);
参数说明
sockfd
: Socket描述符。backlog
: 指定等待连接队列的最大长度。
返回值说明
- 成功时返回
0
。 - 失败时返回
-1
,并设置errno
。
之前进行三次握手的时候说过,会有一个连接队列,用于暂时保存等待的连接
这里的listen就可以设置改连接队列的大小,指定等待连接的数量
接受连接——accept
接受客户端的连接请求,并返回一个新的Socket描述符用于与客户端通信。
函数造型:
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数说明:
sockfd
: 监听Socket描述符。addr
: 指向存储客户端地址信息的sockaddr
结构体。addrlen
: 指向addr
结构体大小的指针。
返回值说明:
- 成功时返回一个新的Socket描述符,用于与客户端通信。
- 失败时返回
-1
,并设置errno
。
请求连接——coonect
客户端使用该函数连接到服务器。
函数造型
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数说明:
sockfd
: Socket描述符。addr
: 指向包含服务器IP地址和端口信息的sockaddr
结构体。addrlen
:addr
结构体的大小。
返回值说明:
- 成功时返回
0
。 - 失败时返回
-1
,并设置errno
。
发送与接受——send 和 recv
send()
用于发送数据,recv()
用于接收数据。
两者均需要使用被绑定过,且已被连接的套接字来捕获数据
基本样式
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
参数说明
sockfd
: Socket描述符。buf
: 指向发送或接收数据的缓冲区。len
: 数据的长度。flags
: 通常为0,表示阻塞模式。
注意:
使用socket套接字进行网络通信以前,必须对套接字进行绑定和连接建立!否则无法发送或者接收数据
socket网络通信
服务端网络编程
了解完接口,接下来尝试使用socket套接字完成服务器的搭建
服务器搭建一般流程:
创建套接字
绑定套接字
监听连接
接受连接
发送与接受
关闭套接字
1.创建套接字
//创建套接字int socket_fd = socket(AF_INET,SOCK_STREAM,0);
2.绑定套接字
//先创建一个struct sockaddr_in结构体对象并填充struct sockaddr_in serv_addr;//将内部清零memset(&serv_addr, 0, sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = INADDR_ANY; // INADDR_ANY表示监听所有的接口serv_addr.sin_port = htons(8080); // 填充端口号bind(socket_fd,(sockaddr*)(&serv_addr),sizeof(serv_addr)
注意:
- 我们这边并没有将服务端的ip地址设置成唯一的,而是使用INADDR_ANY,是表示监听所有ip地址的连接,因为一台网络设备不一定只有一个ip地址
3.监听套接字
int length = 1;if(listen(socket_fd,length)!=0){perror("listen failed");close(socket_fd);exit(EXIT_FAILURE);}
注意:
- 这个等待队列是可以进行根据自己的需求进行设置
4.接收连接
//连接套接字struct sockaddr_in cilent_addr;memset(&cilent_addr,0,sizeof(cilent_addr));socklen_t cilent_len = sizeof(cilent_addr);int connect_fd = accept(socket_fd,(sockaddr*)(&cilent_addr),&cilent_len);
5.发送与接收
while(flag){char recv_buff[1024];//这里用于发送数据和接受数据recv(connect_fd,recv_buff,sizeof(recv_buff),0);std::cout<<"cilent say:"<<recv_buff<<std::endl;char send_buff[1024] = "server have got it!";send(connect_fd,send_buff,sizeof(send_buff),0);}
6.关闭连接
close(socket_fd);
close(connect_fd);
客户端网络编程
客户端搭建一般流程:
创建套接字
设置服务器信息
请求连接
数据发送与接收
关闭连接
1.创建套接字
//创建套接字int socket_fd = socket(AF_INET,SOCK_STREAM,0);
2.设置服务器信息
//设置服务器地址结构struct sockaddr_in server_addr;memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(server_port);inet_pton(AF_INET,server_ip.c_str(),&server_addr.sin_addr);
3.请求连接
if(connect(socket_fd,(sockaddr*)(&server_addr),sizeof(server_addr))!= 0){perror("connect failed");close(socket_fd);exit(EXIT_FAILURE);}
注意:
- 客户端并不需要自己设置自己的ip地址和端口,一旦连接建立成功,发送数据,这些都会自己绑定
客户端的ip地址是唯一的,但端口号不唯一,而是操作系统随机分配的
为什么端口号要随机分配?
如果一个主机起了多个客户端,这些客户端都会进行抢占端口
如果不进行随机绑定,而是特定端口的话
就会出现两个客户端同时使用一个端口的情况,导致其中一个客户端无法通信
例如
- 夸克使用8080端口,网易云也使用8080端口
- 夸克客户端先启动,就会先占用这个端口,网易云就不能再使用这个端口,无法进行通信
因为一个端口只能一个进程,另一个进程就无法通信
4.数据的发生与接收
//接受和发送数据while(flag){char recv_buff[1024];char send_buff[1024] = "hello ,i am cilent";send(socket_fd,send_buff,sizeof(send_buff),0);//这里用于发送数据和接受数据recv(socket_fd,recv_buff,sizeof(recv_buff),0);std::cout<<"server say:"<<recv_buff<<std::endl;}
5.关闭连接
//关闭套接字close(socket_fd);
通信示例
启动服务端
./server
启动客户端
./cilent
运行结果:
服务端
客户端
其实网络通信也是进程通信的一种
不过由原来的主机之间不同进程通信,变成了不同主机间的进程通信。
结语
Socket编程的学习是一个不断深入的过程,每一次的实践都是对网络通信理解的深化。希望本文能够为你在Socket编程的学习道路上提供一些帮助,并激发你对网络编程的兴趣和探索欲望。
在未来的学习和实践中,愿你能够不断挑战自我,掌握更多的网络编程技能,创造出更加出色的网络应用程序!无论你是继续深入研究网络通信的底层原理,还是专注于开发高性能的网络服务,Socket编程都将是你不可或缺的工具和基石。编程之路虽长,但每一步都充满了成长的机会和无限的可能。加油!
相关文章:
【Linux网络】——Socket网络编程
前言 在当今数字化的时代,网络通信已经成为计算机领域不可或缺的一部分。无论是日常的网页浏览、社交媒体交互,还是大规模的企业级数据传输,都离不开高效可靠的网络通信。而在Linux操作系统中,Socket网络编程是实现各种网络应用的…...
基于javaweb的SpringBoot雪具商城系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
Android 简化图片加载与显示——使用Coil和Kotlin封装高效工具类
为了简化使用Coil加载网络图片和GIF的过程,我们可以封装一个工具类。这个工具类将包括初始化ImageLoader的方法、加载图片到ImageView的方法,以及可能的其他便捷方法,如加载圆形图片、设置占位图等。下面是一个示例: 首先&#x…...
Flink watermark的时间字段有空值,建表的时候,如何处理
在 Flink 中处理时间字段存在空值时,需通过 表定义阶段的特殊处理 和 Watermark 生成策略调整 来避免因空值导致的窗口计算异常或任务失败。以下是具体解决方案及实现方法: 1. 空值处理核心策略 1.1 查询时,过滤空值数据(推荐&am…...
关于matlab和python谁快的问题
关于matlab和python谁快的问题,python比matlab在乘法上快10倍,指数计算快4倍,加减运算持平,略慢于matlab。或许matlab只适合求解特征值。 import torch import timen 50000 # 矩阵规模 M torch.rand(n, 31)start_time time.t…...
【DevOps】DevOps and CI/CD Pipelines
DevOps 是一种将开发与运维实践相结合的模式,旨在缩短软件开发周期并交付高质量软件。 DevOps 是什么? 开发团队与运维团队之间的协作 • 持续集成与持续交付(CI/CD) • 流程自动化 • 基础设施即代码(IaC)…...
ROS--IMU数据包
IMU惯性测量单元 一:IMU二:ROS中三:IMU数据包三:总结 提示:以下是本篇文章正文内容,下面案例可供参考 一:IMU IMU(Inertial Measurement Unit,惯性测量单元)…...
【机器学习】手撕封装PCA——将高维数据映射到低维数据的过程
PCA将高维数据映射到低维数据的过程 一、摘要二、PCA的降维思路三、PCA代码实现降维过程3.1 PCA类的实现与封装3.2 PCA类的使用示例 四、PCA的恢复过程 一、摘要 本文详细介绍了主成分分析法(PCA)在高维数据降维中的应用。首先,阐述了PCA的基…...
LangChain开发(七)自定义输出格式(JSON/XML/YAML)
文章目录 JSON结构输出未使用PydanticPydantic流式处理 XML结构输出xml输出指定字段 YAML输出源码地址参考资料 JSON结构输出 虽然一些模型提供商支持内置的方法返回结构化输出,但并非所有都支持。我们可以使用输出解析器来帮助用户通过指示指定任意的JSON模型&…...
RustDesk部署到linux(自建服务器)
简介 RustDesk是一款开源的远程桌面软件,由中国开发者开发,使用Rust编程语言构建。它支持跨平台运行,可以在Windows、macOS、Linux、iOS、Android和Web等多个平台上使用。RustDesk的主要功能包括远程桌面访问、文件传输、文本聊天等&…...
分布式锁,redisson,redis
目录 什么是分布式锁分布式锁解决什么问题分布式锁的特点使用分布式锁的场景怎么使用分布式锁1. 添加依赖2. 配置 Redisson 客户端3. 使用 Redisson 实现分布式锁 什么是分布式锁 分布式锁是一种锁机制,用于在分布式环境下,解决多个线程并发访问同一共享…...
linux常用指令(9)
加油同志们,我们离胜利不远了,再有两天我们就可以了解完linux的一些基本常用指令了,到时我们便可以进入一些shell脚本语法了,那么话不多说,来看. 1.more指令 功能描述:more指令是一个基于vi编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容. 基本语法…...
深入解析 JVM 内存区域及核心概念
深入解析 JVM 内存区域及核心概念 Java 虚拟机(JVM)内部划分了多个内存区域,每个区域存储不同类型的数据并承担不同的职责。本文将详细介绍以下内容: 程序计数器:记录当前线程正在执行的字节码指令及其“行号”信息&a…...
字节跳动春招研发部笔试题解
字节跳动春招研发部笔试题 1.万万没想到之聪明的编辑 我叫王大锤,是一家出版社的编辑。我负责校对投稿来的英文稿件,这份工作非常烦人,因为每天都要去修正无数的拼写错误。但是,优秀的人总能在平凡的工作中发现真理。我发现一个发…...
java对象模型
java对象自身的存储模型JVM会给这个类创建一个instanceKlass,保存在方法区,用来在JVM层表示该Java类。 a类。当我们在Java代码中,使用new创建一个对象的时候,JVM会在栈中给对象赋值,会在堆中创建一个instanceOopDesc对…...
深入理解指针(3)(C语言版)
文章目录 前言 一、字符指针变量二、数组指针变量2.1 数组指针变量是什么2.2 数组指针变量怎么初始化2.2.1 静态初始化2.2.2 动态初始化 三、二维数组传参的本质四、函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 typedef关键字4.4拓展 五、函数指针数组六、转…...
Linux内核 内存管理 物理内存初始化流程
1.ARM64页表初始化流程图 start_kernel()│▼ setup_arch() // 架构相关初始化│▼ early_fixmap_init() // 初始化Fixmap(临时映射设备树等)│▼ arm64_memblock_init() // 从设备树解析内存布局│▼ arm…...
Day23:和为s的数字
购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。 示例 1: 输入:price [3, 9, 12, 15], target 18 输出:[3,15] 或者 [15,3]示例 2&#x…...
Transformer 通关秘籍2:利用 BERT 将文本 token 化
前面两节分别通过两个代码示例展示了模型将文本转换为 token 之后是什么样的,希望你可以对此有一个感性的认识。 本节来简要介绍一下将一个连续的文本转换为 token 序列的大致过程,这个过程被称为分词,也叫 tokenization。 在你没了解这方面…...
电脑干货:万能驱动--EasyDrv8
目录 万能驱动EasyDrv8 功能介绍 主程序界面 驱动解压与安装 PE环境支持 系统部署环境 桌面环境一键解决方案 万能驱动8电脑版是由IT天空出品的一款智能识别电脑硬件并自动安装驱动的工具,一般又称为it天空万能驱动,万能驱动vip版,简称…...
18502 字符串哈希匹配字符串
18502 字符串哈希匹配字符串 ⭐️难度:中等 🌟考点:字符串hash 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int…...
openmmlab介绍 一下
OpenMMLab 是由商汤科技(SenseTime)发起并维护的开源深度学习项目,专注于计算机视觉领域。它提供了一系列模块化、可扩展的工具库,旨在帮助研究者和开发者高效地实现、复现和部署前沿的视觉算法。OpenMMLab 的设计强调模块化、…...
基于javaweb的SpringBoot线上网络文件管理系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
【设计模式】工厂模式详解-----简单工厂模式、工厂方法模式、抽象工厂模式
工厂模式详解 一、概述 工厂模式(Factory Pattern) 是一种 创建型设计模式,用于 封装对象的创建逻辑,避免在代码中直接实例化对象,从而提高代码的 可维护性、扩展性和解耦性。 二、工厂模式分类 工厂模式包括 简单工…...
【雅思播客09】Turn Left here.
Hello everyone! And welcome to my channel! Im Reevs. Good morning! 大家好,欢迎来到懒人英语晨读栏目,我是Reevs,早上好呀。 I have a great lesson for you today. 今天我有一堂非常棒的课。 We have an elementary lesson, which is …...
初阶7 vector
本章重点 vector的介绍vector的使用vector的模拟实现 1.vector的介绍 vector就类似数据结构中的顺序表 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。 意味着可以采用下标对vector的元素 进行访问,和数…...
归并排序总结
归并排序是分治法的典型应用,把两个或k个有序的子序列合并为一个。2路归并,2合一。k路归并,k合一。内部排序通常采用2路归并排序,先将数组分成两半,分别排序,然后合并。合并的过程需要将两个有序的子数组合…...
ollama迁移已下载的单个模型到服务器
ollama迁移已下载的单个模型到服务器 场景 ollama是面向用户级的,部署和运行都很简单,是否高效就另说了。但最起码,他能充分利用用户的硬件设备,在GPU不足也能调用cpu和内存去加持。 ollama运行的模型基本是量化版本的…...
基于SSM+Vue物流信息管理系统(附源码)
预览页面 获取方式 https://gitee.com/XiaoLin_Java/communion/blob/master/README.en.md...
docker创建registry镜像仓库2.8版本
目录 shell脚本内容 运行效果 问题与解决 涉及镜像包registry:2.8(x86版本) shell脚本内容 [roottest1 docker]# cat registry.sh #!/bin/bash read -p "请输入用户:" user read -p "请输入密码:" passpathpwd passdir"$…...
Ubuntu下用QEMU模拟运行OpenBMC
1、前言 在调试过程中,安装了很多依赖库,具体没有记录。关于kvm,也没理清具体有什么作用。本文仅记录,用QEMU成功的将OpenBMC跑起来的过程,做备忘,也供大家参考。 2、环境信息 VMware Workstation 15 Pro…...
Unity Shader编程】之复杂光照
在Unity Shader的LightMode标签中,除了前向渲染和延迟渲染外,还支持多种渲染模式设置。以下是主要分类及用途: 一、核心渲染路径模式 前向渲染相关 ForwardBase 用于基础光照计算,处理环境光、主平行光、逐顶点/SH光源及光照贴图。…...
从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.1.3前馈网络(FFN)与激活函数(GELU)优化
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 2.1.3 前馈网络(FFN)与激活函数(GELU)优化1. 前馈网络(FFN)的架构设计与数学原理1.1 FFN在Transformer中的核心作用2. GELU激活函数的数学特性与优化2.1 GELU的数学形式与近似计算3. 逐行代码实现…...
STM32 MODBUS-RTU主从站库移植
代码地址 STM32MODBUSRTU: stm32上的modbus工程 从站 FreeModbus是一个开源的Modbus通信协议栈实现。它允许开发者在各种平台上轻松地实现Modbus通信功能,包括串口和以太网。FreeMODBUS提供了用于从设备和主站通信的功能,支持Modbus RTU和Modbus TCP协…...
计算机是如何工作的
目录 冯诺依曼体系 CPU基本工作流程: 逻辑门 门电路 算术逻辑单元 ALU(Arithmetic&LogicUnit) 算术单元(Arithmetic Unit) 逻辑单元(Logic Unit) ALU符号 寄存器(Register)和内存(RAM) 控制单元 CU(Control Unit) 指令(Instruc…...
Arduino、ESP32驱动GUVA-S12SD UV紫外线传感器(光照传感器篇)
目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 UV紫外线传感器是一个测试紫外线总量的最佳传感器,它不需要使用波长滤波器,只对紫外线敏感。 Arduino UV紫外线传感器,直接输出对应紫外线指数(UV INDEX)的线性电压,输出电压范围大约0~1100mV(对应UV INDEX值…...
【NLP 48、大语言模型的神秘力量 —— ICL:in context learning】
目录 一、ICL的优势 1.传统做法 2.ICL做法 二、ICL的发展 三、ICL成因的两种看法 1.meta learning 2.Bayesian Inference 四、ICL要点 ① 语言模型的规模 ② 提示词prompt中提供的examples数量和顺序 ③ 提示词prompt的形式(format) 五、fine-tune VS I…...
面向对象软件工程实践软件案例
智力运动-数字化思维训练课程介绍 数字化思维训练是科技赋能素质教育创新实践项目,通过数字化信息化手段,深度融合优质原创智力运动教育课程资源,服务幼儿园与小学,提供信息时代校园素质教育教学解决方案。在《面向对象软件工程》…...
PX4飞控-接收MAVLINK消息(2)-生成MAVLINK_MSG_ID_***.h文件
我在自制的底板上跑vxworks操作系统中移植了MAVLINK的C库用来与PX4飞控进行通信,其中使用的C库和其他依赖文件,例如common文件夹均为从飞控源码中获取,文件获取位置为px4-Autopolite/bulid/mavlink中,因为PX4源码中自带MAVLINK的依…...
Spring Boot 连接 MySQL 配置参数详解
Spring Boot 连接 MySQL 配置参数详解 前言参数及含义常用参数及讲解和示例useUnicode 参数说明: 完整配置示例注意事项 前言 在 Spring Boot 中使用 Druid 连接池配置 MySQL 数据库连接时,URL 中 ? 后面的参数用于指定连接的各种属性。以下是常见参数…...
【数据结构】_单链表_相关面试题(二)
本章重点 hello友友们~ 今天我们将对单链表的后半部分的相关面试题进行详细解析,下面就跟着我一起开启吧~ really GO! 1.相交链表 题目: 输入两个链表,找出它们的第一个公共结点。 代码分析: //找到相交结点…...
深入理解指针(2)(C语言版)
文章目录 前言一、数组名的理解二、使用指针访问数组三、一维数组传参的本质四、冒泡排序五、二级指针六、指针数组七、指针数组模拟二维数组总结 前言 在上一篇文章中,我们初步了解了指针的基本概念和用法。今天,我们将继续深入探索指针在数组、函数传…...
二叉树相关算法实现:判断子树与单值二叉树
目录 一、判断一棵树是否为另一棵树的子树 (一)核心思路 (二)代码实现 (三)注意要点 二、判断一棵树是否为单值二叉树 (一)核心思路 (二)代码实现…...
redux ,react-redux,redux-toolkit 简单总结
Redux、React-Redux 和 Redux Toolkit 是协同工作的三个库,各自承担不同角色,相互协同。 Redux:基础底座 底层状态管理库,负责状态存储、Action 派发和 Reducer 执行 React-Redux:连接 React 组件与 Redux Store 通…...
5. 实现一个中间件
原文地址: 实现一个中间件 更多内容请关注:php代码框架 理解中间件 中间件(Middleware) 是一种在请求被路由到控制器方法之前或响应返回客户端之前执行的代码。它通常用于处理通用任务,如身份验证、日志记录、CORS 处理等。 在…...
数据库理论基础
数据库理论基础 1.1 什么是数据库 数据: 描述事物的符号记录, 可以是数字、 文字、图形、图像、声音、语言等,数据有多种形式,它们都可以经过数字化后存入计算机。 数据库: 存储数据的仓库,是长期存放在…...
STM32学习笔记之振荡器(原理篇)
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
SQL Server安装程序无法启动:系统兼容性检查失败
问题现象: 运行 SQL Server 2022 安装程序时,提示 “硬件或软件不满足最低要求”,安装向导直接退出或无法继续。 快速诊断 操作系统版本检查: # 查看 Windows 版本(需 20H2 或更高) winver 支持的系统&…...
C++20 中的std::c8rtomb和 std::mbrtoc8
文章目录 1. 引言2. std::c8rtomb 函数详解3. std::mbrtoc8 函数详解4. 使用示例5. 注意事项6. 总结 1. 引言 C20 标准引入了对 UTF-8 编码的更好支持,其中包括两个重要的函数:std::c8rtomb 和 std::mbrtoc8。这两个函数分别用于将 UTF-8 编码的字符转换…...
树形结构的工具类TreeUtil
这个地方是以null为根节点,相关以null或者0自己在TreeUtil中加代码,就行 基础类 package com.jm.common.entity;import lombok.Data;import java.util.ArrayList; import java.util.List;/*** Author:JianWu* Date: 2025/3/26 9:02*/ Data public clas…...