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

网络编程核心技术解析:从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
    uint32_t htonl(uint32_t hostlong);  // 主机长整型 → 网络字节序  
    uint32_t ntohl(uint32_t netlong);  // 网络长整型 → 主机字节序  
    uint16_t htons(uint16_t hostshort); // 主机短整型 → 网络字节序  
    uint16_t ntohs(uint16_t netshort); // 网络短整型 → 主机字节序  
    
    关键作用:端口号(16位)和IP地址(32位)必须通过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)。
  • 阻塞模式recvaccept默认阻塞,客户端断开时返回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. 错误处理

  • 所有系统调用(如socketbindaccept)必须检查返回值,避免静默失败。

4. 性能优化

  • 非阻塞IO:通过fcntl设置套接字为非阻塞模式,配合select/poll/epoll实现多路复用,提升并发能力。
  • 地址重用:调用setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)),允许端口快速重用(避免ADDR_INUSE错误)。

总结

网络编程是构建分布式系统的基石,理解字节序、套接字地址结构和核心系统调用是掌握Socket编程的关键。通过服务器-客户端实战代码,可直观感受TCP连接的建立与数据交互过程,而netstat等工具则是排查网络问题的必备手段。在实际开发中,需注意错误处理、字节序转换和性能优化,确保程序的健壮性和高效性。

相关文章:

网络编程核心技术解析:从Socket基础到实战开发

网络编程核心技术解析&#xff1a;从Socket基础到实战开发 一、Socket编程核心基础 1. 主机字节序与网络字节序&#xff1a;数据传输的统一语言 在计算机系统中&#xff0c;不同架构对多字节数据的存储顺序存在差异&#xff0c;而网络通信需要统一的字节序标准&#xff0c;这…...

SQL注入总结

一.sql注入 原理&#xff1a;当一个网站存在与用户交互的功能&#xff08;如登录表单、搜索框、评论区等&#xff09;&#xff0c;并且用户输入的数据未经充分过滤或转义&#xff0c;直接拼接到后台数据库查询语句中执行时&#xff0c;就可能引发SQL注入漏洞。攻击者可以通过构…...

conda 安装cudnn

通过 Conda 安装 cuDNN 确保你有 NVIDIA GPU 和 CUDA Toolkit&#xff1a;首先&#xff0c;确保你的系统上安装了 NVIDIA GPU 和 CUDA Toolkit。你可以通过运行以下命令来检查 CUDA 是否已安装&#xff1a;nvcc --version 如果没有安装 CUDA&#xff0c;你需要先从 NVIDIA CU…...

强啊!Oracle Database 23aiOracle Database 23ai:使用列别名进行分组排序!

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; 从 Oracle Database 23ai 开始&#xff0c;您可以在 GROUP BY 和 HAVING 子句中直接使用列别名。此功能在早期版本的 Oracle Database 中不…...

RAG 2.0 深入解读

一、Introduction 过去一年可谓是RAG元年&#xff0c;检索增强生成技术迅速发展与深刻变革&#xff0c;其创新与应用已深刻重塑了大模型落地的技术范式。站在2025年&#xff0c;RAG不仅突破了早期文本处理的局限&#xff0c;更通过多模态融合、混合检索优化和语义鸿沟跨越等突…...

Excel Vlookup

VLOOKUP(A2, Sheet2!A:B, 2, 0) 代表的是检查A2,匹配源是sheet2表AB两列 Sheet2!A:B&#xff1a;指定要在其中查找数据的范围&#xff0c;这里是 Sheet12中的 A 列和 B 列&#xff0c;A 列是查找的依据列&#xff0c;B 列是要返回值的列。2&#xff1a;表示要返回查找区域中的…...

css媒体查询及css变量

媒体查询是 CSS 样式表最重要的功能之一&#xff0c;所谓媒体查询指的就是根据不同的媒体类型&#xff08;设备类型&#xff09;和条件来区分各种设备&#xff08;例如&#xff1a;电脑、手机、平板电脑、盲文设备等&#xff09;&#xff0c;并为它们分别定义不同的 CSS 样式。…...

CSS网格布局

网格布局将元素占用的空间划分为二维格子&#xff0c;下级元素放置在格子所在的位置上。划分格子的元素叫做网格容器&#xff0c;其 display 属性是 grid &#xff08;块元素&#xff09;或 inline-grid &#xff08;内联块元素&#xff09;。网格容器的下级元素叫做网格项。容…...

Windows远程连接MySQL报错,本地navicat能连接MySQL

一、报错 telnet 119.87.111.79 3306​​“无法打开到主机的连接。在端口 3306: 连接失败”​​ 表明无法通过 TCP 协议连接到目标服务器的 3306 端口。 二、目的 &#xff08;1&#xff09;​​Telnet 测试的目的​​ Telnet 仅用于测试 ​​TCP 端口是否开放​​&#xff…...

Github打不开怎么办?

国内无法打开github&#xff0c;使有watt toolkit一键加速即可打开。 加速器 加速器直接加速Github原站&#xff0c;在开发者使用或者需要登录账号时非常有效 Watt Toolkit&#xff08;原Steam&#xff09; 官网地址&#xff1a;Watt Toolkit 一、进入官网后&#xff0c;点…...

亿级流量系统架构设计与实战(四)

本章关键词 : 读 / 写分离 、 数据缓存 、 缓存更新 、 CQRS 、 数据分片 、 异步写。 高并发架构设计的要点 形成高并发系统的必要条件 高性能、高可用、可扩展。 高性能: 性能代表一个系统的并行处理能力,在同样的硬件设备条件下 , 性能越高 , 越能节约硬件资源。高可…...

Java基础问题——八股盛宴 | 3w字分享

目录 面向对象与面向过程的区别&#xff1f; Java面向对象有哪些特征&#xff0c;如何应用&#xff1f; 介绍下Java中的四种引用&#xff1f; Java中创建对象有几种方式&#xff1f; Java中的序列化和反序列化是什么&#xff1f; 什么是Java中不可变类&#xff1f; Java…...

保障企业的数据安全需要做什么?

守护企业数据安全&#xff0c;犹如构筑一座固若金汤的城堡&#xff0c;需要从技术壁垒、管理护城河、流程吊桥和人员守卫等多维度精心布局&#xff0c;打造环环相扣的立体防御体系。我们从以下关键项分析&#xff1a; 一、技术层面 数据加密 对敏感数据&#xff08;如客户信息、…...

Flutter开发IOS蓝牙APP的大坑

Core Bluetooth 框架限制&#xff1a;iOS 的 Core Bluetooth 框架存在限制&#xff0c;如果指定的特征配置同时允许通知&#xff08;Notifications&#xff09;和指示&#xff08;Indications&#xff09;&#xff0c;调用相关方法设置通知值时&#xff0c;默认仅会开启通知功能…...

LeetCode 解题思路 45(分割等和子集、最长有效括号)

解题思路&#xff1a; dp 数组的含义&#xff1a; 在数组中是否存在一个子集&#xff0c;其和为 i。递推公式&#xff1a; dp[i] | dp[i - num]。dp 数组初始化&#xff1a; dp[0] true。遍历顺序&#xff1a; 从大到小去遍历&#xff0c;从 i target 开始&#xff0c;直到 …...

AI Agent 入门指南:从 LLM 到智能体

AI. AI. AI. 最近耳朵里是不是总是被这些词轰炸&#xff1f;特别是“Agent”、“AI Agent”、“智能体”、“Agentic”…… 感觉一夜之间&#xff0c;AI 就从我们熟悉的聊天框里蹦出来&#xff0c;要拥有“独立思考”和“自主行动”的能力了&#xff1f; 说实话&#xff0c;一…...

高级java每日一道面试题-2025年5月02日-基础篇[反射篇-编码]-使用反射,获取Class对象

如果有遗漏,评论区告诉我进行补充 面试官: 编写代码通过三种方式&#xff08;类名.class、对象.getClass()、Class.forName()&#xff09;获取java.util.ArrayList的Class对象。 我回答: 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#…...

【bug】fused_bias_act_kernel.cu卡住没反应

简述 在推理人脸修复face restoration算法 GPEN的时候&#xff0c;发现有时候fused_bias_act_kernel.cu卡住没反应。 解决 清理下缓存&#xff0c;让程序自己再编译下...

小游戏(2)扫雷游戏

一、简述 鸽子的时间太长了&#xff0c;其实学完数组和函数就应该搞出来这个丐版的小游戏了&#xff0c;不耽误&#xff0c;反正总归是轮到了&#xff0c;嘻嘻。 二、依旧菜单\. 我们这里写的是一个丐版的扫雷游戏&#xff0c;难度就固定了&#xff0c;所以菜单写起来就是玩游…...

如何在vscode中set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`

1.打开工作区设置文件 在 VS Code 中通过文件 -> 首选项 -> 设置&#xff0c;接着在设置窗口的右上角点击打开设置&#xff08;JSON&#xff09;&#xff0c;这会打开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的过程&#xff0c;包括git的下载、设置全局用户名和邮箱、生成SSH密钥、添加GitHubSSH密钥以及终端验证。这些步骤有助于用户顺利进行协同开发。 一、下载git 1、终端输入一下命令 brew install git2、这时下载完成 二、配…...

电子电器架构 --- 网关转发时延解析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

shell-流程控制-循环-函数

1. 2. 3.获取当前目录下的普通文件的文件名作为变量列表打印输出 4.打印出下面语句中字符数不大于6的单词 rabbit is favorite to eat cabbage 5.Shell允许用户指定for语句的步长。当用户需要另外指定步长时 6.批量创建用户&#xff1a; 用户名以test开头&#xff0c;按数字序号…...

Paramiko 性能优化详解

1. 复用连接&#xff1a;减少 SSH 连接开销 SSH 连接的建立涉及 TCP 握手、密钥交换、身份认证等步骤&#xff0c;频繁创建连接会显著降低性能。复用连接是核心优化手段。 优化方法 手动创建 Transport 对象并复用通过同一 Transport 执行多种操作&#xff08;命令、SFTP、端…...

代码随想录图论part03

第十一章&#xff1a;图论part03 孤岛的总面积 &#xff08;深搜&#xff09; 代码随想录 孤岛问题&#xff1a;先处理边缘岛在处理孤岛 沉没孤岛 &#xff08;广搜&#xff09; 代码随想录 水流问题 代码随想录 目的&#xff1a;找水源 思路;逆向思考&#xff0c;找两…...

树上背包学习笔记

树上背包&#xff0c;顾名思义&#xff0c;就是在树上跑背包。每日顾名思义 Q&#xff1a;那么到底为什么要树上跑背包 dp 呢&#xff1f; A&#xff1a;因为我们到现在学的背包 dp 还是属于较浅的一类&#xff0c;什么 01 背包、完全背包还是多重背包&#xff0c;但是如果这…...

CPU:为什么Ryzen 7000系列处理器PCIe通道总数是28,而可用的通道数是24?

AMD Ryzen 7000系列&#xff08;Zen 4架构&#xff09;处理器的 28条PCIe 5.0通道 中&#xff0c;有 4条固定用于连接主板芯片组&#xff08;如X670/B650&#xff09;&#xff0c;剩余的 24条直接分配给用户设备。以下是具体分配逻辑&#xff1a; 1. PCIe通道的总分配 24条直连…...

OpenCV 图形API(80)图像与通道拼接函数-----仿射变换函数warpAffine()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对图像应用仿射变换。 函数 warpAffine 使用指定的矩阵对源图像进行变换&#xff1a; dst ( x , y ) src ( M 11 x M 12 y M 13 , M 21 x M…...

巧记英语四级单词 Unit7-下【晓艳老师版】

navigate v. 航行&#xff0c;航空 那六扇门gatevibrate v.颤抖&#xff0c;抖动 男生早上起来看到六个文胸在那挂着&#xff0c;春心荡漾virtual a.事实上&#xff0c;实际上的 发音“龌龊”&#xff1b;通常lyvia prep.经过 a想成小乌龟&#xff0c;兔子想到河对面吃草&am…...

idea使用lombok错误,找不到符号,明明编译没问题,运行报错

lombok使用出现的问题 问题找不到方法 经常遇到这样的小伙伴看到这个是不是一头雾水&#xff0c;明明我编译没有我问题&#xff0c;运行就出现问题&#xff0c;真的很生气。 下面介绍解决这个问题的几种方法。 开启 annotation processing 开启之后重启&#xff0c;试试有…...

Transformer面经

请问你对Transformer有什么了解 简要回答的话可以这样&#xff1a; Transformer是一种基于自注意力机制的神经网络架构&#xff0c;它主要用于处理序列数据&#xff0c;如自然语言处理。 核心的组件有&#xff1a;自注意力机制&#xff08;计算序列中每个元素与其他元素的相…...

学习Python的第二天之网络爬虫

30岁程序员学习Python的第二天之网络爬虫的信息提取 BeautifulSoup库 地址&#xff1a;https://beautifulsoup.readthedocs.io/zh-cn/v4.4.0/ 1、BeautifulSoup4安装 在windows系统下通过管理员权限运行cmd窗口 运行pip install beautifulsoup4 测试实例 import requests…...

【基础】Python包管理工具uv使用教程

一、uv简介 uv 是由 Astral&#xff08;前身为 Basis&#xff09;团队开发的 Python 包安装器和解析器&#xff0c;完全使用 Rust 语言编写。与传统 Python 工具不同&#xff0c;uv 将多个工具的功能整合到一个高性能的解决方案中&#xff0c;旨在提供更现代、更高效的 Python…...

【十五】Mybatis动态SQL实现原理

Mybatis动态SQL实现原理 目录 Mybatis动态SQL实现原理 概述 动态 SQL 实现原理 总结 概述 每天日常开发都在使用mybatis&#xff0c;但是很多人并没有花心思去理解mybatis的实现原理&#xff0c;一直处于使用阶段&#xff0c;程序员的使命是改变世界&#xff0c;这一点可能…...

UE5 把翅膀动画额外创建动画蓝图并和角色绑定混合动画

把翅膀和角色合并,把翅膀绑在Spine_3上 在5.3内,需要LayerSetup指定骨骼才能使用混合...

Coding Practice,48天强训(30)

Topic 1&#xff1a;爱吃素&#xff08;素数性质&#xff09; 爱吃素 在强训25的第一题我总结过关于素数的几种判断方式&#xff0c;如果忘了可以回去看 第一次写我是这样写的 #include <bits/stdc.h> using namespace std;bool isPrime(long long &a, long long …...

华为私有协议Hybrid

实验top图 理论环节 1. 基本概念 Hybrid接口&#xff1a; 支持同时处理多个VLAN流量&#xff0c;且能针对不同VLAN配置是否携带标签&#xff08;Tagged/Untagged&#xff09;。 核心特性&#xff1a; 灵活控制数据帧的标签处理方式&#xff0c;适用于复杂网络场景。 2. 工作…...

神经网络之互动练习详解:从基础到拟合非线性数据

神经网络之互动练习详解&#xff1a;从基础到拟合非线性数据 在机器学习的世界里&#xff0c;神经网络是一种强大而神奇的工具&#xff0c;它可以帮助我们解决各种复杂的问题。今天&#xff0c;我们就通过一个有趣的互动练习&#xff0c;来深入了解神经网络的工作原理以及如何…...

遨游科普:2025年,三防平板有多智能?

在极端环境与复杂场景中&#xff0c;专业设备的可靠性始终是行业应用的核心命题。随着物联网、5G通信与边缘计算技术的深度融合&#xff0c;三防平板已突破传统“坚固耐用”的单一属性&#xff0c;进化为集多模通讯、智能感知与场景化扩展于一体的移动智能终端。 AORO P9000三防…...

基于C++的IOT网关和平台7:github项目ctGateway设备协议开发指南

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 系…...

yolov8中的python基础--模块导入篇

import语句有几种不同的写法&#xff0c;它们有不同的用途和优势。 1. 直接 import 语法 import module_name 用途 导入整个模块&#xff0c;使用时需要通过模块名访问其中的内容。 示例 import os print(os.listdir()) # 必须用 os. 前缀 适用场景 当需要频繁使用模块…...

26.2Linux中SPI的驱动实验(编程)_csdn

我尽量讲的更详细&#xff0c;为了关注我的粉丝&#xff01;&#xff01;&#xff01; 这里我们用到的是stm32mp157的板子&#xff0c;所以我们看一下SPI用到的引脚。 1、硬件原理图分析 SPI1_MOSI&#xff08;对应芯片引脚 SDA/SDI &#xff09;&#xff1a;主机输出从机输入…...

uv简单使用

通过uv创建项目和虚拟环境 初始化项目 uv init --package my-project 初始化一个名为 my-project 的新项目&#xff0c;并生成必要的文件结构。 创建虚拟环境 uv venv .venv 激活虚拟环境 # For Windows .venv\Scripts\activate# For macOS/Linux source .venv/bin/acti…...

扩增子分析|微生物生态网络稳定性评估之鲁棒性(Robustness)和易损性(Vulnerability)在R中实现

一、引言 周集中老师团队于2021年在Nature climate change发表的文章&#xff0c;阐述了网络稳定性评估的原理算法&#xff0c;并提供了完整的代码。自此对微生物生态网络的评估具有更全面的指标&#xff0c;自此网络稳定性的评估广受大家欢迎。本系列将介绍网络稳定性之鲁棒性…...

线性回归评价标准

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的鼠标移动事件实现一个趣味小程序&#xff1a;当鼠标移动到按钮时&#xff0c;按钮就会随机出现在置&#xff0c;以至于根本点击不到按钮。​​​​​ 2.项目步骤 首先现在ui界面设计控件(也可以用代码的方式创建&#xff0c;就不多说了) 第一个按钮不需…...

深度解析:2D 写实交互数字人 —— 开启智能交互新时代

在当今数字化浪潮汹涌澎湃的 era&#xff0c;人机交互模式正经历着前所未有的变革与重塑。从最初冷冰冰的机械按键&#xff0c;到如今灵动逼真的数字化形象&#xff0c;交互的内涵不断拓展&#xff0c;已不再局限于信息的单向传递&#xff0c;情感交流、场景融合等多维度需求逐…...

论微服务架构设计及应用

目录 摘要(300~330字) 正文(2000~2500字,2200字为宜) 背景介绍(500字做左右) 论点论据(1500字做左右)...