Skynet.socket 函数族使用详解
目录
- Skynet.socket 函数族使用详解
- 核心功能分类
- 一、TCP 连接管理
- 1. 监听端口
- 2. 建立连接
- 3. 关闭连接
- 二、数据读写操作
- 1. 阻塞式读取
- 2. 写入数据
- 2.1 `socket.write(fd, data)` 的返回值
- 2.2 示例代码
- 2.3 关键注意事项
- 2.4 与其他函数的区别
- 2.5 底层原理
- 2.6 总结
- 三、UDP 处理
- 1. 创建 UDP 句柄
- 2. 发送 UDP 数据
- 四、高级控制与监控
- 1. 缓冲区过载警告
- 2. 域名解析
- 五、SocketChannel 封装
- 1. 创建 Channel 对象
- 2. 发送请求
- 六、最佳实践与注意事项
- 总结
Skynet.socket 函数族使用详解
Skynet 的 skynet.socket
模块提供了 TCP/UDP 网络通信的核心 API,结合协程机制实现了阻塞式调用模型,简化了异步网络编程。本文详细解析其核心函数、使用场景及最佳实践。
核心功能分类
- TCP 连接管理(监听、连接、关闭)
- 数据读写(阻塞式读写、分包处理)
- UDP 支持(数据包收发、地址管理)
- 高级控制(缓冲区警告、域名解析、过载处理)
一、TCP 连接管理
1. 监听端口
local socket = require "skynet.socket"-- 启动 TCP 服务器
skynet.start(function()local listen_fd = socket.listen("0.0.0.0", 8888) -- 监听 8888 端口socket.start(listen_fd, function(client_fd, addr)-- 新连接回调,处理客户端请求socket.start(client_fd)-- ... 处理数据逻辑end)
end)
socket.listen(host, port [, backlog])
返回监听套接字的文件描述符listen_fd
。
backlog
:等待连接队列的最大长度(可选,默认 SOMAXCONN)。
2. 建立连接
local client_fd = socket.open("127.0.0.1", 6379) -- 连接 Redis
if client_fd thensocket.start(client_fd)socket.write(client_fd, "PING\r\n")
end
socket.open(host, port)
同步阻塞连接目标地址,返回客户端套接字client_fd
。
3. 关闭连接
socket.close(client_fd) -- 安全关闭,等待未完成读写
socket.close_fd(client_fd) -- 强制立即关闭(慎用)
socket.shutdown(client_fd) -- 强制关闭(适用于 __gc 元方法)
- 区别:
close
:等待其他协程完成读写后关闭。close_fd
/shutdown
:直接关闭,可能导致未处理数据丢失。
二、数据读写操作
1. 阻塞式读取
-- 读取固定字节
local data, partial = socket.read(client_fd, 1024) -- 读 1024 字节
if data thenprint("完整数据:", data)
elseprint("部分数据:", partial) -- 连接已关闭
end-- 读取一行(默认以 \n 分割)
local line = socket.readline(client_fd, "\r\n") -- 自定义分隔符
socket.read(fd, sz)
sz
为nil
时读取尽可能多的数据(至少 1 字节)。- 返回完整数据或
false + 已读部分数据
(连接关闭时)。
2. 写入数据
socket.write(client_fd, "Hello Skynet!\r\n") -- 高优先级写入
socket.lwrite(client_fd, "Low priority data\r\n") -- 低优先级写入
- 优先级区别:
write
:数据进入高优先级队列,优先发送。lwrite
:数据进入低优先级队列,高优先级队列为空时发送。
在 Skynet 框架中,socket.write
方法的返回值取决于数据是否成功写入内核的发送缓冲区。以下是具体说明:
2.1 socket.write(fd, data)
的返回值
-
成功时:
- 返回
true
,表示数据已成功加入内核的发送队列,不保证对端已接收。 - 注意:返回值仅表示数据成功提交到操作系统的网络协议栈,实际网络传输是异步的。
- 返回
-
失败时:
- 返回
nil
+ 错误信息(如"closed"
表示连接已关闭)。 - 常见错误:
"closed"
: 连接已关闭。"timeout"
: 发送超时(需结合socketdriver.settimeout
设置)。"error"
: 其他底层错误。
- 返回
2.2 示例代码
local skynet = require "skynet"
local socket = require "skynet.socket"local fd = ... -- 假设 fd 是已建立的客户端连接-- 尝试发送数据
local ok, err = socket.write(fd, "Hello World")
if not ok thenskynet.error("Send failed:", err)socket.close(fd) -- 关闭失效连接
end
2.3 关键注意事项
- 异步发送:
socket.write
是非阻塞的,数据可能仍在发送队列中未实际传输。 - 流量控制:若发送速度超过网络带宽或对端接收速度,可能导致缓冲区积压,最终触发错误。
- 错误处理:务必检查返回值,及时关闭失效的
fd
,避免资源泄漏。 - 大包分片:单次写入数据过大可能被系统拆分,需结合业务逻辑处理完整性(如添加长度头)。
2.4 与其他函数的区别
socket.send
:与socket.write
行为一致,两者是别名关系。socket.lwrite
:专用于发送 Lua 字符串(内部优化),行为相同。
2.5 底层原理
Skynet 的 socket.write
最终调用操作系统的 send
系统调用,但通过非阻塞模式封装。若内核发送缓冲区已满,数据会排队等待,此时返回 true
;若连接已异常(如对端关闭),则直接返回错误。
2.6 总结
- 返回值意义:
true
表示数据提交成功,nil + err
表示失败。 - 必须处理错误:尤其要捕获
"closed"
错误,及时清理连接状态。 - 性能影响:高频发送时建议结合
socketdriver.setqueue_max
控制缓冲区大小,避免内存暴涨。
三、UDP 处理
1. 创建 UDP 句柄
local udp_fd = socket.udp(function(data, from)print("收到 UDP 数据:", data, "来源:", socket.udp_address(from))
end, "0.0.0.0", 9999) -- 绑定 9999 端口
socket.udp(callback [, host, port])
创建 UDP 句柄并绑定回调,收到数据时触发callback(data, from)
。
2. 发送 UDP 数据
socket.sendto(udp_fd, from_address, "ACK") -- 发送到指定地址
socket.write(udp_fd, "Ping") -- 若已设置默认地址,直接写入
socket.sendto(fd, from, data)
from
为接收到的来源地址字符串,不可手动构造。
四、高级控制与监控
1. 缓冲区过载警告
socket.warning(client_fd, function(fd, size)if size > 0 thenprint("警告:待发数据超过", size, "KB")elseprint("缓冲区已清空")end
end)
socket.warning(fd, callback)
监控待发数据量,超过 1MB 触发回调(默认每超 64KB 打印错误日志)。
2. 域名解析
local dns = require "skynet.dns"
dns.server("8.8.8.8") -- 设置 DNS 服务器
local ip, all_ips = dns.resolve("www.example.com") -- 解析域名
dns.resolve(name [, ipv6])
返回解析到的 IP 地址及所有 IP 列表,避免阻塞 socket 线程。
五、SocketChannel 封装
1. 创建 Channel 对象
local sc = require "skynet.socketchannel"
local channel = sc.channel {host = "127.0.0.1",port = 6379,response = function(sock)return true, sock:readline("\r\n") -- 解析 Redis 响应end,
}
- 模式选择:
- 提供
response
函数则进入 Session 模式(如 MongoDB)。 - 否则为 请求-回应模式(如 Redis)。
- 提供
2. 发送请求
local resp = channel:request("PING\r\n") -- 请求并等待响应
local resp2 = channel:request("GET key\r\n", function(sock)return true, sock:read(5) -- 自定义响应解析
end)
channel:request(req [, response | session])
发送请求并自动匹配响应,支持自定义解析逻辑。
六、最佳实践与注意事项
-
连接生命周期管理
- 使用
socket.close
确保安全关闭。 - 避免在
__gc
中使用阻塞操作,优先用shutdown
。
- 使用
-
协程调度优化
- 高频读写时,合理使用
socket.lwrite
避免阻塞关键数据。 - 结合
skynet.fork
处理并发请求。
- 高频读写时,合理使用
-
错误处理
- 所有读写操作需包裹在
pcall
中捕获异常。 - UDP 需处理乱序和丢包,不可依赖时序。
- 所有读写操作需包裹在
-
性能监控
- 使用
socket.warning
监控缓冲区,防止内存溢出。 - 避免频繁 DNS 查询,通过缓存或独立服务处理。
- 使用
总结
skynet.socket
通过协程化阻塞 API 简化了网络编程复杂度,结合 socketchannel
可高效处理复杂协议。开发者需注意:
- 连接安全性:合理关闭连接,避免资源泄漏。
- 协议适配:根据场景选择基础 API 或高级封装。
- 性能调优:监控缓冲区,平衡吞吐量与内存消耗。
通过阅读 lualib/socket.lua
和参考 service/gate.lua
,可深入理解底层实现机制。
相关文章:
Skynet.socket 函数族使用详解
目录 Skynet.socket 函数族使用详解核心功能分类一、TCP 连接管理1. 监听端口2. 建立连接3. 关闭连接 二、数据读写操作1. 阻塞式读取2. 写入数据2.1 socket.write(fd, data) 的返回值2.2 示例代码2.3 关键注意事项2.4 与其他函数的区别2.5 底层原理2.6 总结 三、UDP 处理1. 创…...
Python signal 模块详解:优雅处理异步事件
诸神缄默不语-个人技术博文与视频目录 在 Linux 或类 Unix 系统中,信号(Signal)是一种用于进程间通信的机制,允许操作系统或其他进程向目标进程发送异步通知。 Python 的 signal 模块提供了对这些信号的访问和处理能力࿰…...
[LeetCode 189] 轮转数组
[LeetCode 189] 轮转数组 题目描述: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 示例 2: 输入:nums [-1,-100,3,99], k 2 …...
【Qt】qDebug() << “中文测试“; 乱码问题
环境 Qt Creator版本:4.7.1 编译器:MSVC2015_32bit 解法一 在.pro文件中添加 msvc:QMAKE_CXXFLAGS -execution-charset:utf-8注意: 1、需要清理项目,并重新qmake,然后构建。 测试项目下载:https://do…...
解析Java根基:Object类核心方法
Object类常见方法解析 在Java编程中,Object类是所有类的根类,它包含了许多实用的方法,这些方法在不同的场景下发挥着重要作用。下面我们来详细了解一下Object类中的一些常见方法。 1. toString方法 toString方法是用于将对象转换为字符串表…...
最近在工作中感受到了设计模式的重要性
之前了解设计模式:只是应付一下面试 在之前一年多的工作中也没遇到使用场景 最近在搭建验证环境的时候,才发现这玩意这么重要 首先是设计模式的使用场景一定是在很复杂繁琐的场景下进行的 之所以说是复杂/繁琐的场景,因为一些场景也许逻辑不难…...
Docker 镜像、容器与数据卷的高效管理:最佳实践与自动化脚本20250411
Docker 镜像、容器与数据卷的高效管理:最佳实践与自动化脚本 引言 在现代软件开发中,容器化技术正变得越来越重要。Docker 作为容器化的代表工具,在各大企业中得到了广泛的应用。然而,随着容器化应用的增多,如何高效…...
[UEC++]UE5C++各类变量相关知识及其API(更新中)
基础变量 UE自己定义的目的:1.跨平台;2.兼容反射;3.方便宏替换 FString 基础赋值与初始化 遍历与内存 迭代器访问 清除系列操作 合并 插入与移除 RemoveFromStart是从开头看,没有则移除失败返回false; RemoveFromEnd是…...
C++中的设计模式
设计模式是软件工程中用于解决常见问题的可复用解决方案。它们提供了一种标准化的方法来设计和实现软件系统,从而提高代码的可维护性、可扩展性和可重用性。C 是一种支持多种编程范式(如面向对象、泛型编程等)的语言,因此可以方便…...
Java 设计模式:装饰者模式详解
Java 设计模式:装饰者模式详解 装饰者模式(Decorator Pattern)是一种结构型设计模式,它通过动态地为对象添加新功能,扩展其行为,而无需修改原有类的代码。装饰者模式遵循“开闭原则”,提供了比…...
C++ 大数相加(简要版)
#include <algorithm> #include <iterator> class Solution { public:/*** 计算两个数之和* param s string字符串 表示第一个整数* param t string字符串 表示第二个整数* return string字符串*/string solve(string s, string t) {// 处理空字符串的情况…...
Spring IoC深度解析:掌控Bean存储艺术与分层架构的智慧
一、IoC的本质:从"造物主"到"使用者"的思维跃迁 在传统编程中,开发者像"造物主"一样亲手创建每个对象(new UserController()),并管理它们的依赖关系。这种方式导致代码高度耦合…...
8.4 容器2
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 8.4.3 TabControl(选项卡)控件 TabControl控件可以通过设置多个选项卡页(TabPage控件)…...
一组可能的机器学习问题列表
线性回归与多项式拟合的关系最小二乘法在机器学习中的应用梯度下降是如何实现的贝叶斯分类器的应用场景高斯分布与判定在哪里用到模型的评估有哪些参数误差中的偏差和方差定义训练集分组的快捷方式如何度量模型性能查准率查全率的定义roc,aux的含义正则化是什么意思k均值用来解…...
Android 权限列表
权限名称描述android.permission.ACCESS_CHECKIN_PROPERTIES访问登记属性读取或写入登记 check-in 数据库属性表的权限android.permission.ACCESS_COARSE_LOCATION获取粗略位置通过 WiFi 或移动基站的方式获取用户粗略的经纬度信息,定位精度大概误差在 30~1500 米an…...
探索在视频深度伪造中的细微的表情变化或对特定面部特征的小改动检测方法
概述 2019 年,美国众议院议长南希佩洛西成为了一次针对性的、技术含量相对较低的“深度伪造”式攻击的目标。真实的佩洛西视频被编辑,让她看起来像是喝醉了酒。这一不真实的事件在真相大白之前被分享了数百万次,而且在一些人没有关注后续报道…...
调用阿里云API实现身份证文字识别
TOC# 1.作者介绍 姚元帅,男,西安工程大学电子信息学院,2024级研究生 研究方向:机器视觉与人工智能 电子邮件:3183969029qq.com 乔幸荣,女,西安工程大学电子信息学院,2024级研究生&a…...
使用UFW+IPSET禁用海外IP配置持久化操作
上一章我们介绍了如何使用ufwipset禁用海外IP,但是如果服务器重启动,之前的配置就无效了,所以让配置持久化可以避免我们反复设置的麻烦。 IPSET配置持久化的方法有很多种,目前我配置成的是设置ipset后台服务,具体方法…...
深入Linux内核理解socket的本质
本文将从一个初学者的角度开始聊起,让大家了解 Socket 是什么以及它的原理和内核实现。 一、Socket 的概念 Socket 就如同我们日常生活中的插头与插座的连接关系。在网络编程中,Socket 是一种实现网络通信的接口或机制。 想象一下,插头插入…...
Python使用爬虫IP抓取数据过程
用户之前询问了不同语言的爬虫示例,特别是Python、Node.js和Ruby。现在他们希望详细扩展Python版本中使用代理IP的过程。 用户可能已经掌握了基本的爬虫编写,但遇到了IP被封的问题,或者想防止被封。他们需要知道如何集成代理IP到现有的代码中…...
通过MCP+数据库实现AI检索和分析
通过 MCP(Multi-Agent Collaboration Platform,多智能体协作平台) 数据库,实现一个AI检索和分析系统。 一、系统目标 实现通过 AI 多智能体对结构化(数据库)和非结构化(文档、文本)…...
51单片机烧录程序演示教程
51单片机烧录程序演示教程 51单片机是一种经典的8位单片机,广泛应用于嵌入式系统开发中。烧录程序是指将编译好的代码下载到单片机的存储器中,以便单片机能够按照程序运行。以下是详细的烧录流程和步骤。 所需工具和材料 硬件: 51单片机开发…...
06软件测试需求分析案例-添加用户
给职业顾问部的老师添加用户密码后,他们才能登录使用该软件。只有admin账户具有添加用户、修改用户信息、删除用户的权利。admin是经理或团队的第一个人的账号,后面招一个教师就添加一个账号。 通读需求是提取信息,提出问题,输出…...
Asp.NET Core WebApi IOptions<T>详解
IOptions<T> 是 ASP.NET Core 中用于访问配置数据的一个接口,它属于 Microsoft.Extensions.Options 命名空间。通过 IOptions<T>,你可以将配置绑定到强类型的类中,并在应用程序的不同部分中注入和使用这些配置。这种方式不仅使得…...
Gartner发布软件供应链安全市场指南:软件供应链安全工具的8个强制功能、9个通用功能及全球29家供应商
攻击者的目标是由开源和商业软件依赖项、第三方 API 和 DevOps 工具链组成的软件供应链。软件工程领导者可以使用软件供应链安全工具来保护他们的软件免受这些攻击的连锁影响。 主要发现 越来越多的软件工程团队现在负责解决软件供应链安全 (SSCS) 需求。 软件工件、开发人员身…...
(四十三)Dart 中的空安全与 `required` 关键字
Dart 中的空安全与 required 关键字 空安全(Null Safety) 空安全(Null Safety)是 Dart 语言的一项重要特性,旨在帮助开发者避免空指针异常(NullPointerException)。空安全通过在编译时检查变量…...
《解锁分布式软总线:构建智能设备统一管理平台》
智能设备的数量呈爆发式增长,从智能家居里的各类电器,到智能办公中的电脑、打印机,再到工业领域的各种自动化设备,不一而足。如何对这些纷繁复杂的智能设备进行有效管理,成为摆在我们面前的一道难题。分布式软总线技术…...
【android bluetooth 协议分析 01】【HCI 层介绍 1】【hci_packets.pdl 介绍】
在 AOSP 的蓝牙协议栈 (Gabeldorsche) 中,hci_packets.pdl 是一个 协议描述语言文件,用于定义 HCI (Host Controller Interface) 层的数据包结构和通信协议。以下是详细解析: 1. 文件作用 system/gd/hci/hci_packets.pdl 协议自动化生成&…...
远程升级组件设计
----------------------- | 主应用程序 | ---------------------- | 通信接口(使用本地socket通信发送给远程升级模块进程或者线程 | (如何启动进程程execl或execv函数),启动线程用std::sthread。 v ---------------------- 远程升级模块 ----------…...
Kubernetes集群环境搭建与初始化
1.Kubernetes简介: Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。 在Kubernetes中,我…...
Compose 适配 - 响应式排版 自适应布局
一、概念 基于可用空间而非设备类型来设计自适应布局,实现设备无关性和动态适配性,避免硬编码,以不同形态布局更好的展示内容。 二、区分可用空间 WindowSizeClasses 传统根据屏幕大小和方向做适配的方式已不再适用,APP的显示方式…...
5G_WiFi_CE_DFS
目录 一、规范要求 1、法规目录 2、定义 3、运行模式 4、主/从设备相关的运行行为及具体的动态频率选择(DFS)要求 5、产品角色确定测试项目 6、测试项目 测试项1:信道可用性检查(Channel Availability Check) …...
Lalamove基于Flink实时湖仓演进之路
摘要:本文投稿自货拉拉国际化技术部 资深数据仓库工程师林海亮老师。内容分为以下几个部分: 1、业务简介 2、Flink 在业务中的应用与挑战 3、实时数仓架构的 Flink 驱动演进 4、未来展望 一、业务简介 Lalamove 于2013年在香港成立,是货拉拉的…...
【含文档+PPT+源码】基于微信小程序的卫生院预约挂号管理系统的设计与实现
项目视频介绍: 毕业作品基于微信小程序的卫生院预约挂号管理系统的设计与实现 课程简介: 本课程演示的是一款基于微信小程序的卫生院预约挂号管理系统的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习…...
人工智能100问☞第2问:机器学习的核心原理是什么?
目录 一、通俗解释 二、专业解析 三、权威参考 机器学习的核心原理是通过数据训练模型,使计算机自动发现数据中的内在规律或模式,并利用这些规律对新数据做出预测或决策。这一过程强调数据驱动(从经验中学习)、模型优化(通过损失函数和参数调整提升性能)以及泛…...
【深度学习基础】——机器的神经元:感知机
感知机模型的原理之前已经讲过(【感知机模型 - CSDN App】https://blog.csdn.net/2401_88885149/article/details/145563837?sharetypeblog&shareId145563837&sharereferAPP&sharesource2401_88885149&sharefromlink)但主要是从数学和机…...
OpenCV 图形API(29)图像滤波-----GMat类
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::GMat 是 OpenCV 的 G-API 模块中的一个核心类,用于定义计算图中的数据节点。G-API 是 OpenCV 中的一个模块,旨在通过…...
spark的堆外内存,是在jvm内还是操作系统内存内?
在 Apache Spark 中,堆外内存(Off-Heap Memory)是直接分配在操作系统的物理内存中,而非 JVM 堆内内存。以下是详细的解释: 1. 堆外内存的本质 操作系统管理 Spark 的堆外内存直接通过操作系统分配(例如使用…...
AD9253 LVDS 高速ADC驱动开发
1、查阅AD9253器件手册 2、查阅Xilinx xapp524手册 3、该款ADC工作在125Msps下,14bit - 2Lane - 1frame 模式。 对应:data clock时钟为500M DDR mode。data line rate:1Gbps。frame clock:1/4 data clock 具体内容:…...
swift菜鸟教程14(闭包)
一个朴实无华的目录 今日学习内容:1.Swift 闭包1.1闭包定义1.2闭包实例1.3闭包表达式1.3.1sorted 方法:据您提供的用于排序的闭包函数将已知类型数组中的值进行排序。1.3.2参数名称缩写:直接通过$0,$1,$2来顺序调用闭包的参数。1.3.3运算符函…...
【HarmonyOS NEXT+AI】问答02:有一点编程基础,可以学不?
在“HarmonyOS NEXTAI大模型打造智能助手APP(仓颉版)”课程里面,有学员问,有一点编程基础,可以学不? 这里统一做下回复。 学习本课程只需要掌握任一编程语言即可,拥有JavaScript、TypeScript、ArkTS或Java语言基础更佳…...
maven 依赖的优先级
最短路径优先 工程中依赖了a、b两个jar包, 在a jar包内引用了b jar包版本为1.0,路径为:Project > a > b(1.0) 工程中直接依赖的b jar包版本为2.0,路径为:Project > b(2.0) 由于b(2.0)路径最短࿰…...
Java实现音频录音播放机功能
Java实现一个简单的音频录音和播放功能,使用Swing创建图形用户界面,利用Java Sound API进行音频处理。下面是对此程序的详细剖析: 一、程序结构 程序主要由以下几个部分组成: RecorderFrm类:主框架类,继承自…...
OpenCV 图形API(26)图像滤波-----方框滤波函数boxFilter()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用方框滤波器模糊图像。 该函数使用以下内核来平滑图像: K α [ 1 1 … 1 1 1 … 1 ⋮ ⋮ ⋱ ⋮ 1 1 … 1 ] K \alpha \begin{b…...
oracle 表空间(Tablespace)
在 Oracle 11g 中,表空间(Tablespace) 是数据库存储架构的核心逻辑单元,其原理基于 逻辑存储与物理存储的分离,通过分层管理数据文件、段(Segment)、区(Extent)和数据块&…...
Git 高级操作
Git不仅是代码管理的基石工具,更是开发者提升效率的瑞士军刀。掌握基础操作只是起点,真正的高手都在使用进阶技巧优化工作流。本文将深入解析Git四大高阶操作,助你轻松应对复杂开发场景! 一、交互式暂存:精准控制提交粒…...
Go:程序结构
文章目录 名称声明变量短变量声明指针new 函数变量的生命周期 赋值多重赋值可赋值性 类型声明包和文件导入包初始化 作用域 名称 命名规则: 通用规则:函数、变量、常量、类型、语句标签和包的名称,开头须是字母(Unicode 字符 &a…...
sqlserver2017 分离附加数据库
分离数据库 分离数据库是指将数据库从 SQL Server 实例中移除,但会完整保留数据库及其数据文件和事务日志文件。 然后可以使用这些文件将数据库附加到任何 SQL Server 实例,包括分离该数据库的服务器。 如果存在下列任何情况,则不能分离数据…...
QuarkPi-CA2 RK3588S卡片电脑:6.0Tops NPU+8K视频编解码+接口丰富,高性能嵌入式开发!
QuarkPi-CA2 RK3588S卡片电脑:6.0Tops NPU8K视频编解码接口丰富,高性能嵌入式开发! 芯片框架 视频介绍 https://www.bilibili.com/video/BV1btdbYkEjY 开发板介绍 核心升级,产品炸裂 QuarkPi-CA2卡片电脑搭载瑞芯微RK3588S芯片…...
对称加密与非对称加密与消息摘要算法保证https的数据交互的完整性和保密性
一、对称加密与非对称加密的作用 1. 对称加密 作用: 保密性:对称加密使用相同的密钥对数据进行加密和解密,确保数据在传输过程中不被窃听。效率:对称加密算法(如AES)计算速度快,适合加密大量数…...