网络编程核心技术解析:从Socket基础到实战开发
网络编程核心技术解析:从Socket基础到实战开发
一、Socket编程核心基础
1. 主机字节序与网络字节序:数据传输的统一语言
在计算机系统中,不同架构对多字节数据的存储顺序存在差异,而网络通信需要统一的字节序标准,这是理解网络编程的重要前提。
主机字节序:架构决定的存储顺序
-
大端字节序(Big-Endian)
- 存储规则:高位字节存放在低地址,低位字节存放在高地址。
- 示例:32位整数
0x12345678
在内存中存储为12 34 56 78
。 - 典型场景:网络协议(如TCP/IP)、文件格式(如BMP)、PowerPC架构CPU。
-
小端字节序(Little-Endian)
- 存储规则:低位字节存放在低地址,高位字节存放在高地址。
- 示例:32位整数
0x12345678
在内存中存储为78 56 34 12
。 - 典型场景:x86架构CPU、DVI/HDMI数据传输。
网络字节序:跨主机通信的统一标准
- 定义:网络协议规定的字节序,采用大端字节序,确保不同架构主机间数据解析一致。
- 转换函数(
netinet/in.h
)
关键作用:端口号(16位)和IP地址(32位)必须通过uint32_t htonl(uint32_t hostlong); // 主机长整型 → 网络字节序 uint32_t ntohl(uint32_t netlong); // 网络长整型 → 主机字节序 uint16_t htons(uint16_t hostshort); // 主机短整型 → 网络字节序 uint16_t ntohs(uint16_t netshort); // 网络短整型 → 主机字节序
htons
/htonl
转换为网络字节序后再发送。
思考:为什么网络字节序采用大端?
答:大端序符合人类阅读习惯,且网络协议设计时参考了早期主机(如VAX)的字节序,逐渐成为标准。
2. 套接字地址结构:网络通信的“门牌号”
套接字地址结构是网络编程中标识通信端点的核心数据结构,分为通用结构和专用结构。
通用套接字地址结构(struct sockaddr
)
struct sockaddr { sa_family_t sa_family; // 地址族(如AF_INET、AF_INET6) char sa_data[14]; // 地址数据(不同协议族格式不同)
};
sa_family
常见值:AF_INET
:IPv4协议族AF_INET6
:IPv6协议族AF_UNIX
:Unix域套接字(本地进程间通信)
IPv4专用结构(struct sockaddr_in
)
struct in_addr { u_int32_t s_addr; // IPv4地址(网络字节序)
}; struct sockaddr_in { sa_family_t sin_family; // 地址族(AF_INET) u_int16_t sin_port; // 端口号(网络字节序,需htons转换) struct in_addr sin_addr; // IPv4地址结构体
};
IP地址转换函数(arpa/inet.h
)
inet_addr
:点分十进制字符串 → 网络字节序整数in_addr_t ip = inet_addr("127.0.0.1"); // 返回32位网络字节序整数
inet_ntoa
:网络字节序整数 → 点分十进制字符串struct in_addr addr = {.s_addr = htonl(0x7F000001)}; char* ip_str = inet_ntoa(addr); // 返回"127.0.0.1"
注意:
inet_addr
不支持255.255.255.255
以外的广播地址,新代码推荐使用inet_pton
/inet_ntop
(支持IPv6)。
3. 网络编程接口:Socket系统调用详解
Socket编程通过一系列系统调用实现网络通信,核心接口如下:
(1)基础接口
函数 | 功能 | 关键参数说明 |
---|---|---|
socket() | 创建套接字 | domain :协议族(AF_INET)type :SOCK_STREAM(TCP)/SOCK_DGRAM(UDP) |
bind() | 绑定地址和端口 | addr :套接字地址结构体 |
listen() | 启动监听,创建连接队列 | backlog :最大等待连接数(如5) |
accept() | 接受客户端连接 | 返回新的连接套接字描述符 |
connect() | 客户端发起连接 | serv_addr :服务器地址 |
(2)数据读写接口
-
TCP(面向连接)
ssize_t recv(int sockfd, void *buff, size_t len, int flags); // 读数据 ssize_t send(int sockfd, const void *buff, size_t len, int flags); // 写数据
flags
常用值:0
(阻塞模式)、MSG_DONTWAIT
(非阻塞)。
-
UDP(无连接)
ssize_t recvfrom(int sockfd, void *buff, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); // 读数据并获取发送方地址 ssize_t sendto(int sockfd, const void *buff, size_t len, int flags, struct sockaddr *dest_addr, socklen_t addrlen); // 写数据并指定接收方地址
(3)生命周期管理
close()
:关闭套接字,释放资源。- 注意:TCP调用
close()
会发送FIN报文,进入四次挥手;UDP直接关闭,无连接释放过程。
二、服务器-客户端通信实战:TCP实现
1. 服务器端代码解析(循环服务器)
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>int main() {// 1. 创建TCP套接字 int listen_fd = socket(AF_INET, SOCK_STREAM, 0); if (listen_fd < 0) { perror("socket failed"); exit(1); } // 2. 绑定地址和端口 struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(6000); // 端口号转网络字节序 server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 本地回环地址 if (bind(listen_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("bind failed"); exit(1); } // 3. 启动监听 if (listen(listen_fd, 5) < 0) { perror("listen failed"); exit(1); } printf("Server listening on 127.0.0.1:6000...\n"); while (1) { // 4. 接受客户端连接 struct sockaddr_in client_addr; socklen_t client_len = sizeof(client_addr); int conn_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &client_len); if (conn_fd < 0) { perror("accept failed"); continue; } printf("Client connected: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); // 5. 数据交互 char buff[128]; while (1) { ssize_t n = recv(conn_fd, buff, sizeof(buff)-1, 0); if (n <= 0) { // 客户端关闭或出错 printf("Client disconnected\n"); break; } buff[n] = '\0'; printf("Received: %s\n", buff); send(conn_fd, "ok", 2, 0); // 发送确认 } close(conn_fd); // 关闭连接套接字 } close(listen_fd); // 关闭监听套接字 return 0;
}
2. 客户端代码解析
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>int main() {// 1. 创建TCP套接字 int sock_fd = socket(AF_INET, SOCK_STREAM, 0); if (sock_fd < 0) { perror("socket failed"); exit(1); } // 2. 连接服务器 struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(6000); server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); if (connect(sock_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("connect failed"); exit(1); } printf("Connected to server\n"); // 3. 数据交互 char buff[128]; while (1) { printf("Enter message (end to quit): "); fgets(buff, sizeof(buff), stdin); if (strncmp(buff, "end", 3) == 0) break; send(sock_fd, buff, strlen(buff)-1, 0); // 发送数据(去除换行符) ssize_t n = recv(sock_fd, buff, sizeof(buff), 0); if (n <= 0) { printf("Server disconnected\n"); break; } buff[n] = '\0'; printf("Server response: %s\n", buff); } close(sock_fd); return 0;
}
3. 代码关键点
- 端口号处理:必须通过
htons
转换为网络字节序,否则服务器无法正确识别。 - 地址转换:
inet_addr
将字符串转为网络字节序整数,inet_ntoa
反向转换(注意线程不安全,新代码用inet_ntop
)。 - 阻塞模式:
recv
和accept
默认阻塞,客户端断开时返回n <= 0
,需处理ECONNRESET
等错误码。
三、网络状态查看:netstat -natp
实用指南
netstat
是排查网络问题的核心工具,-natp
选项用于查看TCP连接状态和端口占用。
1. 命令参数解析
netstat -natp
-n
:以数字形式显示IP和端口(不解析域名/服务名)。-a
:显示所有连接(包括监听和已建立)。-t
:仅显示TCP连接。-p
:显示进程PID和名称。
2. 输出字段说明
字段 | 含义 | 典型值举例 |
---|---|---|
Proto | 协议(TCP/UDP) | TCP |
Local Address | 本地地址和端口 | 127.0.0.1:6000 |
Foreign Address | 远程地址和端口 | 0.0.0.0:0 |
State | 连接状态 | LISTEN(监听)、ESTABLISHED(已建立) |
PID/Program name | 占用端口的进程PID和名称 | 1234/sshd |
3. 常见状态解释
- LISTEN:服务器正在监听端口,等待连接。
- ESTABLISHED:客户端与服务器已建立连接,数据交互中。
- TIME_WAIT:连接关闭后,客户端等待2MSL时间(防止旧数据干扰新连接)。
- CLOSE_WAIT:服务器未正确关闭连接,可能导致资源泄漏(需检查代码中
close()
调用)。
4. 实战场景
- 检查端口占用:
netstat -natp | grep 6000
定位占用端口的进程。 - 排查连接泄漏:观察
CLOSE_WAIT
状态连接数,确认服务器是否漏调close()
。
四、最佳实践与常见问题
1. 字节序转换注意事项
- 端口号(16位)用
htons
/ntohs
,IP地址(32位)用htonl
/ntohl
。 - 避免直接赋值:
sin_port = 6000;
错误,必须sin_port = htons(6000);
。
2. 地址结构初始化
- 用
memset(&addr, 0, sizeof(addr))
初始化结构体,确保未使用字段为0。
3. 错误处理
- 所有系统调用(如
socket
、bind
、accept
)必须检查返回值,避免静默失败。
4. 性能优化
- 非阻塞IO:通过
fcntl
设置套接字为非阻塞模式,配合select
/poll
/epoll
实现多路复用,提升并发能力。 - 地址重用:调用
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))
,允许端口快速重用(避免ADDR_INUSE
错误)。
总结
网络编程是构建分布式系统的基石,理解字节序、套接字地址结构和核心系统调用是掌握Socket编程的关键。通过服务器-客户端实战代码,可直观感受TCP连接的建立与数据交互过程,而netstat
等工具则是排查网络问题的必备手段。在实际开发中,需注意错误处理、字节序转换和性能优化,确保程序的健壮性和高效性。
相关文章:
网络编程核心技术解析:从Socket基础到实战开发
网络编程核心技术解析:从Socket基础到实战开发 一、Socket编程核心基础 1. 主机字节序与网络字节序:数据传输的统一语言 在计算机系统中,不同架构对多字节数据的存储顺序存在差异,而网络通信需要统一的字节序标准,这…...
SQL注入总结
一.sql注入 原理:当一个网站存在与用户交互的功能(如登录表单、搜索框、评论区等),并且用户输入的数据未经充分过滤或转义,直接拼接到后台数据库查询语句中执行时,就可能引发SQL注入漏洞。攻击者可以通过构…...
conda 安装cudnn
通过 Conda 安装 cuDNN 确保你有 NVIDIA GPU 和 CUDA Toolkit:首先,确保你的系统上安装了 NVIDIA GPU 和 CUDA Toolkit。你可以通过运行以下命令来检查 CUDA 是否已安装:nvcc --version 如果没有安装 CUDA,你需要先从 NVIDIA CU…...
强啊!Oracle Database 23aiOracle Database 23ai:使用列别名进行分组排序!
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! 从 Oracle Database 23ai 开始,您可以在 GROUP BY 和 HAVING 子句中直接使用列别名。此功能在早期版本的 Oracle Database 中不…...
RAG 2.0 深入解读
一、Introduction 过去一年可谓是RAG元年,检索增强生成技术迅速发展与深刻变革,其创新与应用已深刻重塑了大模型落地的技术范式。站在2025年,RAG不仅突破了早期文本处理的局限,更通过多模态融合、混合检索优化和语义鸿沟跨越等突…...
Excel Vlookup
VLOOKUP(A2, Sheet2!A:B, 2, 0) 代表的是检查A2,匹配源是sheet2表AB两列 Sheet2!A:B:指定要在其中查找数据的范围,这里是 Sheet12中的 A 列和 B 列,A 列是查找的依据列,B 列是要返回值的列。2:表示要返回查找区域中的…...
css媒体查询及css变量
媒体查询是 CSS 样式表最重要的功能之一,所谓媒体查询指的就是根据不同的媒体类型(设备类型)和条件来区分各种设备(例如:电脑、手机、平板电脑、盲文设备等),并为它们分别定义不同的 CSS 样式。…...
CSS网格布局
网格布局将元素占用的空间划分为二维格子,下级元素放置在格子所在的位置上。划分格子的元素叫做网格容器,其 display 属性是 grid (块元素)或 inline-grid (内联块元素)。网格容器的下级元素叫做网格项。容…...
Windows远程连接MySQL报错,本地navicat能连接MySQL
一、报错 telnet 119.87.111.79 3306“无法打开到主机的连接。在端口 3306: 连接失败” 表明无法通过 TCP 协议连接到目标服务器的 3306 端口。 二、目的 (1)Telnet 测试的目的 Telnet 仅用于测试 TCP 端口是否开放ÿ…...
Github打不开怎么办?
国内无法打开github,使有watt toolkit一键加速即可打开。 加速器 加速器直接加速Github原站,在开发者使用或者需要登录账号时非常有效 Watt Toolkit(原Steam) 官网地址:Watt Toolkit 一、进入官网后,点…...
亿级流量系统架构设计与实战(四)
本章关键词 : 读 / 写分离 、 数据缓存 、 缓存更新 、 CQRS 、 数据分片 、 异步写。 高并发架构设计的要点 形成高并发系统的必要条件 高性能、高可用、可扩展。 高性能: 性能代表一个系统的并行处理能力,在同样的硬件设备条件下 , 性能越高 , 越能节约硬件资源。高可…...
Java基础问题——八股盛宴 | 3w字分享
目录 面向对象与面向过程的区别? Java面向对象有哪些特征,如何应用? 介绍下Java中的四种引用? Java中创建对象有几种方式? Java中的序列化和反序列化是什么? 什么是Java中不可变类? Java…...
保障企业的数据安全需要做什么?
守护企业数据安全,犹如构筑一座固若金汤的城堡,需要从技术壁垒、管理护城河、流程吊桥和人员守卫等多维度精心布局,打造环环相扣的立体防御体系。我们从以下关键项分析: 一、技术层面 数据加密 对敏感数据(如客户信息、…...
Flutter开发IOS蓝牙APP的大坑
Core Bluetooth 框架限制:iOS 的 Core Bluetooth 框架存在限制,如果指定的特征配置同时允许通知(Notifications)和指示(Indications),调用相关方法设置通知值时,默认仅会开启通知功能…...
LeetCode 解题思路 45(分割等和子集、最长有效括号)
解题思路: dp 数组的含义: 在数组中是否存在一个子集,其和为 i。递推公式: dp[i] | dp[i - num]。dp 数组初始化: dp[0] true。遍历顺序: 从大到小去遍历,从 i target 开始,直到 …...
AI Agent 入门指南:从 LLM 到智能体
AI. AI. AI. 最近耳朵里是不是总是被这些词轰炸?特别是“Agent”、“AI Agent”、“智能体”、“Agentic”…… 感觉一夜之间,AI 就从我们熟悉的聊天框里蹦出来,要拥有“独立思考”和“自主行动”的能力了? 说实话,一…...
高级java每日一道面试题-2025年5月02日-基础篇[反射篇-编码]-使用反射,获取Class对象
如果有遗漏,评论区告诉我进行补充 面试官: 编写代码通过三种方式(类名.class、对象.getClass()、Class.forName())获取java.util.ArrayList的Class对象。 我回答: 在Java中,反射(Reflection)是一种强大的机制&#…...
【bug】fused_bias_act_kernel.cu卡住没反应
简述 在推理人脸修复face restoration算法 GPEN的时候,发现有时候fused_bias_act_kernel.cu卡住没反应。 解决 清理下缓存,让程序自己再编译下...
小游戏(2)扫雷游戏
一、简述 鸽子的时间太长了,其实学完数组和函数就应该搞出来这个丐版的小游戏了,不耽误,反正总归是轮到了,嘻嘻。 二、依旧菜单\. 我们这里写的是一个丐版的扫雷游戏,难度就固定了,所以菜单写起来就是玩游…...
如何在vscode中set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`
1.打开工作区设置文件 在 VS Code 中通过文件 -> 首选项 -> 设置,接着在设置窗口的右上角点击打开设置(JSON),这会打开settings.json文件。 2.添加环境变量设置 "terminal.integrated.env.linux": { "TF_EN…...
leetcode 24. 两两交换链表中的节点
题目描述 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next…...
微调大模型如何准备数据集——常用数据集,Alpaca和ShareGPT
微调大模型如何准备数据集——常用数据集,Alpaca和ShareGPT 数据集准备常用数据集自定义数据集AlpacaShareGPT数据集准备 常用数据集 预训练数据集 Wiki Demo (en)RefinedWeb (en)RedPajama V2 (en)Wikipedia (en)Wikipedia (zh)Pile (en)...
使用Homebrew下载配置git和连接GitHub(Mac版)
本文详细介绍了在M系列Mac上安装Homebrew并配置Git的过程,包括git的下载、设置全局用户名和邮箱、生成SSH密钥、添加GitHubSSH密钥以及终端验证。这些步骤有助于用户顺利进行协同开发。 一、下载git 1、终端输入一下命令 brew install git2、这时下载完成 二、配…...
电子电器架构 --- 网关转发时延解析
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...
shell-流程控制-循环-函数
1. 2. 3.获取当前目录下的普通文件的文件名作为变量列表打印输出 4.打印出下面语句中字符数不大于6的单词 rabbit is favorite to eat cabbage 5.Shell允许用户指定for语句的步长。当用户需要另外指定步长时 6.批量创建用户: 用户名以test开头,按数字序号…...
Paramiko 性能优化详解
1. 复用连接:减少 SSH 连接开销 SSH 连接的建立涉及 TCP 握手、密钥交换、身份认证等步骤,频繁创建连接会显著降低性能。复用连接是核心优化手段。 优化方法 手动创建 Transport 对象并复用通过同一 Transport 执行多种操作(命令、SFTP、端…...
代码随想录图论part03
第十一章:图论part03 孤岛的总面积 (深搜) 代码随想录 孤岛问题:先处理边缘岛在处理孤岛 沉没孤岛 (广搜) 代码随想录 水流问题 代码随想录 目的:找水源 思路;逆向思考,找两…...
树上背包学习笔记
树上背包,顾名思义,就是在树上跑背包。每日顾名思义 Q:那么到底为什么要树上跑背包 dp 呢? A:因为我们到现在学的背包 dp 还是属于较浅的一类,什么 01 背包、完全背包还是多重背包,但是如果这…...
CPU:为什么Ryzen 7000系列处理器PCIe通道总数是28,而可用的通道数是24?
AMD Ryzen 7000系列(Zen 4架构)处理器的 28条PCIe 5.0通道 中,有 4条固定用于连接主板芯片组(如X670/B650),剩余的 24条直接分配给用户设备。以下是具体分配逻辑: 1. PCIe通道的总分配 24条直连…...
OpenCV 图形API(80)图像与通道拼接函数-----仿射变换函数warpAffine()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 对图像应用仿射变换。 函数 warpAffine 使用指定的矩阵对源图像进行变换: dst ( x , y ) src ( M 11 x M 12 y M 13 , M 21 x M…...
巧记英语四级单词 Unit7-下【晓艳老师版】
navigate v. 航行,航空 那六扇门gatevibrate v.颤抖,抖动 男生早上起来看到六个文胸在那挂着,春心荡漾virtual a.事实上,实际上的 发音“龌龊”;通常lyvia prep.经过 a想成小乌龟,兔子想到河对面吃草&am…...
idea使用lombok错误,找不到符号,明明编译没问题,运行报错
lombok使用出现的问题 问题找不到方法 经常遇到这样的小伙伴看到这个是不是一头雾水,明明我编译没有我问题,运行就出现问题,真的很生气。 下面介绍解决这个问题的几种方法。 开启 annotation processing 开启之后重启,试试有…...
Transformer面经
请问你对Transformer有什么了解 简要回答的话可以这样: Transformer是一种基于自注意力机制的神经网络架构,它主要用于处理序列数据,如自然语言处理。 核心的组件有:自注意力机制(计算序列中每个元素与其他元素的相…...
学习Python的第二天之网络爬虫
30岁程序员学习Python的第二天之网络爬虫的信息提取 BeautifulSoup库 地址:https://beautifulsoup.readthedocs.io/zh-cn/v4.4.0/ 1、BeautifulSoup4安装 在windows系统下通过管理员权限运行cmd窗口 运行pip install beautifulsoup4 测试实例 import requests…...
【基础】Python包管理工具uv使用教程
一、uv简介 uv 是由 Astral(前身为 Basis)团队开发的 Python 包安装器和解析器,完全使用 Rust 语言编写。与传统 Python 工具不同,uv 将多个工具的功能整合到一个高性能的解决方案中,旨在提供更现代、更高效的 Python…...
【十五】Mybatis动态SQL实现原理
Mybatis动态SQL实现原理 目录 Mybatis动态SQL实现原理 概述 动态 SQL 实现原理 总结 概述 每天日常开发都在使用mybatis,但是很多人并没有花心思去理解mybatis的实现原理,一直处于使用阶段,程序员的使命是改变世界,这一点可能…...
UE5 把翅膀动画额外创建动画蓝图并和角色绑定混合动画
把翅膀和角色合并,把翅膀绑在Spine_3上 在5.3内,需要LayerSetup指定骨骼才能使用混合...
Coding Practice,48天强训(30)
Topic 1:爱吃素(素数性质) 爱吃素 在强训25的第一题我总结过关于素数的几种判断方式,如果忘了可以回去看 第一次写我是这样写的 #include <bits/stdc.h> using namespace std;bool isPrime(long long &a, long long …...
华为私有协议Hybrid
实验top图 理论环节 1. 基本概念 Hybrid接口: 支持同时处理多个VLAN流量,且能针对不同VLAN配置是否携带标签(Tagged/Untagged)。 核心特性: 灵活控制数据帧的标签处理方式,适用于复杂网络场景。 2. 工作…...
神经网络之互动练习详解:从基础到拟合非线性数据
神经网络之互动练习详解:从基础到拟合非线性数据 在机器学习的世界里,神经网络是一种强大而神奇的工具,它可以帮助我们解决各种复杂的问题。今天,我们就通过一个有趣的互动练习,来深入了解神经网络的工作原理以及如何…...
遨游科普:2025年,三防平板有多智能?
在极端环境与复杂场景中,专业设备的可靠性始终是行业应用的核心命题。随着物联网、5G通信与边缘计算技术的深度融合,三防平板已突破传统“坚固耐用”的单一属性,进化为集多模通讯、智能感知与场景化扩展于一体的移动智能终端。 AORO P9000三防…...
基于C++的IOT网关和平台7:github项目ctGateway设备协议开发指南
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 系…...
yolov8中的python基础--模块导入篇
import语句有几种不同的写法,它们有不同的用途和优势。 1. 直接 import 语法 import module_name 用途 导入整个模块,使用时需要通过模块名访问其中的内容。 示例 import os print(os.listdir()) # 必须用 os. 前缀 适用场景 当需要频繁使用模块…...
26.2Linux中SPI的驱动实验(编程)_csdn
我尽量讲的更详细,为了关注我的粉丝!!! 这里我们用到的是stm32mp157的板子,所以我们看一下SPI用到的引脚。 1、硬件原理图分析 SPI1_MOSI(对应芯片引脚 SDA/SDI ):主机输出从机输入…...
uv简单使用
通过uv创建项目和虚拟环境 初始化项目 uv init --package my-project 初始化一个名为 my-project 的新项目,并生成必要的文件结构。 创建虚拟环境 uv venv .venv 激活虚拟环境 # For Windows .venv\Scripts\activate# For macOS/Linux source .venv/bin/acti…...
扩增子分析|微生物生态网络稳定性评估之鲁棒性(Robustness)和易损性(Vulnerability)在R中实现
一、引言 周集中老师团队于2021年在Nature climate change发表的文章,阐述了网络稳定性评估的原理算法,并提供了完整的代码。自此对微生物生态网络的评估具有更全面的指标,自此网络稳定性的评估广受大家欢迎。本系列将介绍网络稳定性之鲁棒性…...
线性回归评价标准
In [1]: 12345 import numpy as npfrom sklearn.linear_model import LinearRegressionimport sklearn.datasets as datasets 12 ()diabetesdiabetes $$datasets.load_diabetes In [2]: Out[2]: {‘data’: array([[ 0.03807591,0.05068012,0.06169621,…,-0.00259226, 0.0…...
Qt—鼠标移动事件的趣味小程序:会移动的按钮
1.项目目标 本次根据Qt的鼠标移动事件实现一个趣味小程序:当鼠标移动到按钮时,按钮就会随机出现在置,以至于根本点击不到按钮。 2.项目步骤 首先现在ui界面设计控件(也可以用代码的方式创建,就不多说了) 第一个按钮不需…...
深度解析:2D 写实交互数字人 —— 开启智能交互新时代
在当今数字化浪潮汹涌澎湃的 era,人机交互模式正经历着前所未有的变革与重塑。从最初冷冰冰的机械按键,到如今灵动逼真的数字化形象,交互的内涵不断拓展,已不再局限于信息的单向传递,情感交流、场景融合等多维度需求逐…...
论微服务架构设计及应用
目录 摘要(300~330字) 正文(2000~2500字,2200字为宜) 背景介绍(500字做左右) 论点论据(1500字做左右)...