7.渐入佳境 -- 优雅的断开套接字连接
前言
本章将讨论如何优雅地断开相互连接的套接字。之前用的方法不够优雅是因为,我们是调用close或closesocket函数单方面断开连接的。
一、基于TCP的半关闭
TCP中的断开连接过程比建立连接过程更重要,因为连接过程中一般不会出现大的变数,但断开过程有可能发生预想不到的情况,因此应准确掌控。只有掌握了下面要讲解的半关闭(Half-close),才能明确断开过程。
1.单方面断开带来的问题
Linux的close函数和Windows的closesocket函数意味着完全断开连接。完全断开不仅指无法传输数据,而且也不能接收数据。因此,在某些情况下,通信一方调用close或closesocket函数断开连接就显得不太优雅:
图描述的是2台主机正在进行双向通信。主机A发送完最后的数据后,调用close函数断开了连接,之后主机A无法再接收主机B传输的数据。实际上,是完全无法调用与接收数据相关的函数。最终,由主机B传输的、主机A必须接收的数据也销毁了。
为了解决这类问题,“只关闭一部分数据交换中使用的流”(Half-close)的方法应运而生。断开一部分连接是指,可以传输数据但无法接收,或可以接收数据但无法传输。顾名思义就是只关闭流的一半。
2.套接字和流
两台主机通过套接字建立连接后进人可交换数据的状态,又称“流形成的状态”。也就是把建立套接字后可交换数据的状态看作一种流。
此处的流可以比作水流。水朝着一个方向流动,同样,在套接字的流中,数据也只能向一个方向移动。因此,为了进行双向通信,需要2个流。
一旦两台主机间建立了套接字连接,每个主机就会拥有单独的输人流和输出流。当然,其中一个主机的输人流与另一主机的输出流相连,而输出流则与另一主机的输人流相连。另外,本章节讨论的“优雅地断开连接方式”只断开其中1个流,而非同时断开两个流。Linux的close和Windows的closesocket函数将同时断开这两个流,因此与“优雅”二字还有一段距离。
3.针对优雅断开的 shtdown 函数
接下来介绍用于半关闭的函数。下面这个shutdown函数就用来关闭其中1个流。
#include <sys/socket.h>
int shutdown(int sock, int howto);
// 成功时返回0,失败时返回-1。
// sock -- 需要断开的套接字文件描述符。
// howto -- 传递断开方式信息。
调用上述函数时,第二个参数决定断开连接的方式,其可能值如下所示。
■ SHUT_RD:断开输人流。
■ SHUT_WR:断开输出流。
■ SHUT_RDWR:同时断开I/O流。
若向shutdown的第二个参数传递SHUT_RD,则断开输人流,套接字无法接收数据。即使输人缓冲收到数据也会抹去,而且无法调用输人相关函数。如果向shutdown函数的第二个参数传递SHUT_WR,则中断输出流,也就无法传输数据。但如果输出缓冲还留有未传输的数据,则将传递至目标主机。最后,若传人SHUT_RDWR,则同时中断I/O流。这相当于分2次调用shutdown,其中一次以SHUT_RD为参数,另一次以SHUT_WR为参数。
4.为何需要半关闭
相信各位已对“关闭套接字的一半连接”有了充分的认识,但还有一些疑惑。
– “究竟为什么需要半关闭?是否只要留出足够长的连接时间,保证完成数据交换即可?只要不急于断开连接,好像也没必要使用半关闭。” –
这句话也不完全是错的。如果保持足够的时间间隔,完成数据交换后再断开连接,这时就没必要使用半关闭。但要考虑如下情况:
“一旦客户端连接到服务器端,服务器端将约定的文件传给客户端,客户端收到后发送字符串“Thankyou’给服务器端。”
此处字符串“Thankyou”的传递实际是多余的,这只是用来模拟客户端断开连接前还有数据需要传递的情况。此时程序实现的难度并不小,因为传输文件的服务器端只需连续传输文件数据即可,而客户端则无法知道需要接收数据到何时。客户端也没办法无休止地调用输人函数,因为这有可能导致程序阻塞(调用的函数未返回)
– “是否可以让服务器端和客户端约定一个代表文件尾的字符?” –
这种方式也有问题,因为这意味着文件中不能有与约定字符相同的内容。为解决该问题,服务器端应最后向客户端传递EOF表示文件传输结束。客户端通过函数返回值接收EOF,这样可以避免与文件内容冲突。剩下最后一个问题:服务器如何传递EOF?
– “断开输出流时向对方主机传输EOF。” –
当然,调用close函数的同时关闭I/O流,这样也会向对方发送EOF。但此时无法再接收对方传输的数据。也就是说,若调用close函数关闭流,就无法接收客户端最后发送的字符串“Thankyou”。
这时需要调用shutdown函数,只关闭服务器的输出流(半关闭)。这样既可以发送EOF,同时又保留了输人流,可以接收对方数据。下面结合已学内容实现收发文件的服务器端/客户端。
二、基于半关闭的文件传输程序
上述文件传输服务器端和客户端的数据流可整理如下图,稍后将根据这个图编写示例。希望大家通过此例理解传递EOF的必要性和半关闭的重要性。
首先介绍服务器端。这次示例与之前示例不同,省略了大量错误处理代码,希望大家注意。这种处理只是为了便于分析代码,实际编写中不应省略哦。
// file_server.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 30
void error_handling(char* message);int main(int argc, char* argv[])
{int serv_sd, clnt_sd;FILE* fp;char buf[BUF_SIZE];int read_cnt;struct sockaddr_in serv_adr, clnt_adr;socklen_t clnt_adr_sz;if(argc != 2){printf("Usage : %s <port>\n", argv[0]);exit(1);}fp = fopen("file_server.c", "rb");serv_sd = socket(PF_INET, SOCK_STREAM, 0);memset(&serv_adr, 0, sizeof(serv_adr));serv_adr.sin_family = AF_INET;serv_adr.sin_addr.s_addr = htons(INADDR_ANY);serv_adr.sin_port = htons(atoi(argv[1]));bind(serv_sd, (struct sockaddr*)&serv_adr, sizeof(serv_adr));listen(serv_sd, 5);clnt_adr_sz = sizeof(clnt_adr);clnt_sd = accept(serv_sd, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);while(1){read_cnt = fread((void*)buf, 1, BUF_SIZE, fp);if(read_cnt < BUF_SIZE){write(clnt_sd, buf, read_cnt);break;}write(clnt_sd, buf, BUF_SIZE);}shutdown(clnt_sd, SHUT_WR);read(clnt_sd, buf, BUF_SIZE);printf("Message from client: %s \n", buf);fclose(fp);close(clnt_sd);close(serv_sd);return 0;
}void error_handling(char* message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}
■ 第26行:打开文件以向客户端传输服务器端源文件file_server.c。
■ 第40~49行:为向客户端传输文件数据而编写的循环语句。此客户端是在第38行的accept函数调用中连接的。
■ 第51行:发送文件后针对输出流进行半关闭。这样就向客户端传输了EOF,而客户端也知道文件传输已完成。
■ 第52行:只关闭了输出流,依然可以通过输入流接收数据。
// file_client.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 30
void error_handling(char* message);int main(int argc, char* argv[])
{int sd;FILE *fp;char buf[BUF_SIZE];int read_cnt;struct sockaddr_in serv_adr;if (argc != 3){printf("Usage : %s <IP>\n", argv[0]);exit(1);}fp = fopen("receive.dat", "wb");sd = socket(PF_INET, SOCK_STREAM, 0);memset(&serv_adr, 0, sizeof(serv_adr));serv_adr.sin_family = AF_INET;serv_adr.sin_addr.s_addr = inet_addr(argv[1]);serv_adr.sin_port = htons(atoi(argv[2]));connect(sd, (struct sockaddr*)&serv_adr, sizeof(serv_adr));while((read_cnt = read(sd, buf, BUF_SIZE)) != 0)fwrite((void*)buf, 1, read_cnt, fp);puts("Received file data");write(sd, "Thank you", 10);fclose(fp);close(sd);return 0;
}void error_handling(char* message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}
■ 第26行:创建新文件以保存服务器端传输的文件数据。
■ 第36、37行:接收数据并保存到第18行创建的文件,直到接收EOF为止。
■ 第40行:向服务器端发送表示感谢的消息。若服务器端未关闭输入流,则可接收此消息。
下面是上述示例的运行结果。运行后查看客户端的receive.dat文件,可以验证数据正常接收。特别需要注意的是,还可以确认服务器端已正常接收客户端最后传输的消息“Thankyou”。
server:
client:
总结
`大家是不是对TCP有了更深入的理解呢?有不明白的可以再去网上搜搜看!
相关文章:
7.渐入佳境 -- 优雅的断开套接字连接
前言 本章将讨论如何优雅地断开相互连接的套接字。之前用的方法不够优雅是因为,我们是调用close或closesocket函数单方面断开连接的。 一、基于TCP的半关闭 TCP中的断开连接过程比建立连接过程更重要,因为连接过程中一般不会出现大的变数,…...
Django3 - 开启Django Hello World
一、开启Django Hello World 要学习Django首先需要了解Django的操作指令,了解了每个指令的作用,才能在MyDjango项目里编写Hello World网页,然后通过该网页我们可以简单了解Django的开发过程。 1.1 Django的操作指令 无论是创建项目还是创建项…...
JavaScript 基础特性
一、变量特性 1.1 变量提升 console.log(temp); // undefined(变量提升但未初始化) var temp hello; 现象:var声明的变量会提升至作用域顶部,但赋值不提升 建议:改用 let/const 避免变量提升问题 1.2 变量泄露 fo…...
MATLAB遇到内部问题,需要关闭,Crash Decoding : Disabled - No sandbox or build area path
1.故障界面 MATLAB运行时突然中断,停止运行。故障界面如图: MATLAB Log File: C:\Users\wei\AppData\Local\Temp\matlab_crash_dump.21720-1 ------------------------------------------------ MATLAB Log File -----------------------------------…...
L1-5 吉老师的回归
题目 L1-078 吉老师的回归(15分) 曾经在天梯赛大杀四方的吉老师决定回归天梯赛赛场啦! 为了简化题目,我们不妨假设天梯赛的每道题目可以用一个不超过 500 的、只包括可打印符号的字符串描述出来,如:Probl…...
0413-多态、Object类方法、访问权限修饰符、装箱拆箱、128陷阱
1:A and A 2:A and A 3: A and D 4: B and A 5: B and A 6:A and D 7:B and A 8: B and A 9:A and D package 第四章对象和类;public class ForthThir {//多态:父类的引用指向子类的对象,只能调父类的方法和子类重写的方法,不能调子类独有的方法&…...
Kubernetes控制平面组件:APIServer 准入控制机制详解
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
苍穹外卖day02
菜品相关接口开发 图片上传-阿里云OSS 依赖注入 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>${aliyun.sdk.oss}</version> </dependency> 配置密钥 sky:alioss:end…...
SpringBoot 自定义输出控制台图标
对于控制台输出的这个图标大家都不陌生吧,不仅在SpringBoot中有这种图标,在docker 、 nginx 启动时都有自身独特的图标,这是怎么实现的呢。 需要利用一个网站生成 banner 图标(首页-bootschool.net), 将图标…...
联想电脑开机出现Defalut Boot Device Missing or Boot Failed怎么办
目录 一、恢复bios默认设置 二、关机重启 三、“物理”方法 在图书馆敲代码时,去吃了午饭回来发现刚开机就出现了下图的问题(崩溃),想起之前也发生过一次 这样的问题,现在把我用到的方法写在下面,可能对…...
CST1020.基于Spring Boot+Vue汽车租赁管理系统
计算机/JAVA毕业设计 【CST1020.基于Spring BootVue汽车租赁管理系统】 【项目介绍】 汽车租赁管理系统,基于 Spring Boot Vue 实现,功能丰富、界面精美 【业务模块】 客户管理:查询客户信息、根据条件精准检索、添加客户信息、身份证号校验…...
ArkTS基础语法:从声明到类型的深度解析
# ArkTS基础语法:从声明到类型的深度解析 在鸿蒙应用开发的领域中,ArkTS作为重要的编程语言,其基础语法是开发者们必须掌握的关键内容。今天,我们就围绕ArkTS的声明和类型相关知识展开深入探讨,帮助大家更好地理解和运…...
Day15:关于MySQL的编程技术——基础知识
前言:先创建一个练习的数据库和数据 1.创建数据库并创建数据表的基本结构 -- 创建练习数据库 CREATE DATABASE db_programming; USE db_programming;-- 创建员工表(包含各种数据类型) CREATE TABLE employees (emp_id INT PRIMARY KEY AUTO…...
wsl下编译eXosip和osip库(Ubuntu 22.04)
1.下载eXosip和osip osip下载路径 Index of /mirror/gnu.org/savannah/osip eXosip下载路径 Index of /nongnu/exosip 我选的osip和eXosip版本为 5.2.0 2.编译osip库 tar -zxvf libosip2-5.2.0.tar.gz cd libosip2-5.2.0 ./configure make make install 在编译…...
《轨道力学导论》——第九章:轨道确定与导航
第九章 轨道确定与导航 引言 轨道确定与导航是轨道力学中最为核心的实践领域之一,它将理论与实际应用紧密结合,解决了"我们在哪里"以及"我们将去向何方"这两个航天活动中最基本的问题。无论是地球轨道上的人造卫星、飞向深空的探测…...
几何与游标
在arcgis中,数据组织方式如下 数据库(datasets): 要素类(feature class): 几何(geometry) 属性(attribute) 元数据(metadata) 游标: 查询游标:用于对数据进行查询的游标 arcpy.da.SearchCursor() 作用:用于对数据进行只读查询操作。它可以帮助你逐行读取数据表或…...
【使用jenkins+docker自动化部署java项目】
背景: 有A(打包机129),B(游戏服130) 2个机器,他们都安装有docker,请完成部署。 一、准备好java项目,写好Dockerfile # 基础镜像,使用包含 JDK 17 的 OpenJDK 镜像 FROM openjdk:17-jdk-slim# 设置工作目录 WORKDIR /…...
Vue3+Element Plus如何实现左树右表页面案例:即根据左边的树筛选右侧表功能实现
文章目录 一、最终效果二、源代码2.1 AddDataSource.vue2.2 LeftTree.vue2.3 FieldDrawer.vue2.4 RightTable.vue2.5 Emp.vue 三、代码解读3.1 AddDataSource.vue —— 数据源新增对话框3.2 LeftTree.vue —— 数据源树视图3.3 FieldDrawer.vue —— 字段详情抽屉3.4 RightTabl…...
Redisson的红锁,分段锁,公平锁,联锁。。。。。。
红锁:Redisson红锁可以防止主从集群锁丢失问题。Redisson红锁要求,必须要构建至少三个Redis主从集群,若一个请求要申请锁,必须向所有主从集群中提交key写入请求,只有当大多数集群(过半集群)锁写…...
system V 共享内存
system V是一种标准,linux内核支持这种标准,专门设计了一个ipc模板(通信的接口设计,原理,接口,相似性) 使用各自的虚拟地址访问物理内存 共享内存描述共享内存的内核数据结构它所对应的物理空间 进程间通信的本质&…...
ResNet改进(27):融合EfficientViT 高效混合网络设计
在计算机视觉领域,卷积神经网络(CNN)和视觉Transformer(ViT)各有优势。 今天分享的是一种将两者巧妙结合的方案——在ResNet18基础上引入轻量化ViT模块的设计思路。 整体架构概览 这个混合网络主要由三部分组成: ResNet18骨干网络:作为特征提取器,去掉了原模型的平均池化…...
字符串与栈和队列-算法小结
字符串 双指针 反转字符串(双指针) 力扣题目链接 void reverseString(vector<char>& s) {for (int i 0, j s.size() - 1; i < s.size()/2; i, j--) {swap(s[i],s[j]);} }反转字符串II 力扣题目链接 遍历字符串的过程中,只要让 i (2 * k)&#…...
go语言学习笔记:gin + gorm + mysql 用户增删改查案例入门
大家好,我是此林。 Golang 语言现在已经成为了编程的趋势,毕竟是大厂背书嘛,Google 研发的。 目前很多云原生项目都是基于 go 来编写的,比如: Kubernetes (K8s) 容器编排系统, Docker 容器化技术&…...
设计模式——建造者模式(生成器模式)总结
当我们需要创建一个非常复杂的对象时,可以使用建造者模式,分步骤建造一个对象,最后将完整的对象返回给客户端。 比如,我们要生成一个房子对象,建造一个房子,需要打地基、盖围墙、盖地板、安装门、安装窗户…...
Nginx代理Minio出现AccessDeniedAccessDenied
一、问题描述 AccessDeniedAccessDenied.sight.jpgmediafiles/mediafiles/sight.jpg1835E50603CB8FE0dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8 二、问题排查 (1)minio 和 nginx 是否正常启动 (2)检…...
在ArcGIS Pro中将栅格NoData值修改为特定值
目录 问题如下:栅格文件中NoData值为65535,要将该NoData值修改为-9999 步骤一:使用栅格计算器(Raster Calculator)输出具有新NoData值的栅格文件 步骤二:输出修改值后的栅格文件(Export Rast…...
模糊表示学习 笔记
图表示学习通常从图的拓扑结构和高维节点属性中产生低维和清晰的表示。然而,节点或图的清晰表示实际上隐藏了特征的不确定性和可解释性。例如,在引文网络中,两篇论文之间的引用总是涉及表示相关度的future,也就是说,一…...
GitHub 趋势日报 (2025年04月12日)
本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1yeongpin/cursor-free-vip[Support 0.48.x](Reset Cursor AI MachineID & Auto Sign Up / In & Bypass Higher…...
FreertosHAL库笔记
堆和栈 堆:一块内存空间,用于存储程序运行时动态申请的内存空间。在堆上分配内存可以根据程序的需要灵活地申请和释放不同大小的内存块。可用pvProMalllloc()和vPortFree()函数来开辟和释放 栈:也是一块内存空间,主要用于函数调用…...
迷你世界脚本之容器接口:WorldContainer
容器接口:WorldContainer 彼得兔 更新时间: 2023-04-26 10:21:02 具体函数名及描述如下: 序号 函数名 函数描述 1 addFurnace(...) 新增熔炉 2 removeFurnace(...) 移除熔炉 3 checkFurnace(...) 检测是否为熔炉 4 getFurnaceHeatPerce…...
springboot框架集成websocket依赖实现物联网设备、前端网页实时通信!
需求: 最近在对接一个物联网里设备,他的通信方式是 websocket 。所以我需要在 springboot框架中集成websocket 依赖,从而实现与设备实时通信! 框架:springboot2.7 java版本:java8 好了,还是直接…...
【linux知识】web服务环境搭建(一):用户以及开发环境初始化
toc 创建用户组以及用户 以下是 创建用户组 wendao 和用户 wendao 并指定 GID、UID 及家目录 的完整操作指南: 一、创建用户组(指定 GID) sudo groupadd -g 1500 wendao # 创建组并指定 GID 为 1500• 注意:GID 需唯一&#…...
消息中间件——RocketMQ(一)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 RocketMQ(一) 一、MQ出现的背景 在传统的单体应用架构中,系统的各个模块紧密耦合在一起。随着业务…...
[oeasy]python087_[词根溯源]suspend词源_append_depend
087_[词根溯源]suspend词源_append [词根溯源]suspend词源_append_depend 回忆上次内容 上次了解了 方法 和 函数的 不同之处 方法(method) 函数(function) 需要对象调用 无需对象调用 可以根据 名字调用 无需名字 直接调用 基于类的对象 独立的 需要self 不需要self…...
Ubuntu 安装 Cursor AppImage 到应用程序中
如果 Cursor AppImage 安装到 Ubuntu 系统中(而不是每次手动运行 .AppImage 文件),可以按照以下方法操作: 方法 1:直接运行 AppImage(最简单,但不完全“安装”) 赋予执行权限chmod …...
二叉树 --- 堆(下)
今天我们来把堆完结了。 对于一个高度为 h 的满二叉树,有 F(h) 2 ^ 0 2 ^ 1 …… 2 ^ (h - 1) 2 ^ h - 1 h log2 (N1) 对于一个高度为 h 的完全二叉树,且最后一层只有一个 ,则 F(h) 2 ^ 0 2 ^ 1 …… 2 ^ (h - 2) 1 2 ^ (h -…...
数组对象[object],五种如何去重方法 js
前言 数组有很多方法都可以实现去重。本章分享比较常用的。 准备工作 准备一组数组对象 let arr [{ id: "1", name: "张晓", age: 14 },{ id: "2", name: "张晓", age: 14 },{ id: "3", name: "张晓", age: 1…...
PyRoboPlan 库,给 panda 机械臂微分 IK 上大分,关节限位、碰撞全不怕
视频讲解: PyRoboPlan 库,给 panda 机械臂微分 IK 上大分,关节限位、碰撞全不怕 代码仓库:https://github.com/LitchiCheng/mujoco-learning 今天分享PyRoboPlan库,比之前的方式优点在于,这个库考虑了机械…...
【模态分解】EMD-经验模态分解
算法配置页面,也可以一键导出结果数据 报表自定义绘制 获取和下载【PHM学习软件PHM源码】的方式 获取方式:Docshttps://jcn362s9p4t8.feishu.cn/wiki/A0NXwPxY3ie1cGkOy08cru6vnvc...
Sentinel规则持久化pull模式核心源码解析
文章目录 前言一、服务端新增/修改规则1.1、repository.save1.2、publishRules 二、客户端接收规则三、持久化扩展3.1、持久化原理3.1.1、FileRefreshableDataSource3.1.1.1、super关键字3.1.1.2、firstLoad()方法 3.1.2、FlowRuleManager.register2Property 3.2、持久化实现 总…...
【go】--编译
go build -o [编译完成的可执行文件] [需要编译的.go文件]#例如 go build -o myapp main.go#确保编译的结果和当前运行环境相同 #查看arch uname -a在 Linux 中查看和修改 GOOS 和 GOARCH 环境变量: 1. 查看当前 Go 环境变量 # 查看所有Go相关的环境变量 go env# …...
【Spring底层分析】Spring IoC
Spring IoC IoC:控制反转。将对象创建和对象之间的调用交给Spring容器来管理。好处是降低了对象之间的耦合度。 DI:依赖注入。给bean对象注入依赖的对象。 大白话就是:Spring帮你创建对象,对象的属性如果依赖于某个对象…...
Ubuntu系统进程管理
在Ubuntu系统中,进程管理是系统维护和性能调优的重要部分。以下是关键命令和技巧的总结,帮助你有效管理系统进程: 1. 查看进程 ps 命令:查看当前进程快照。 bash ps aux # 查看所有运行中的进程(a所有用户…...
HDU2196 Computer 树形DP
原题链接 既然要查找每个节点的最远到达距离,由于该图是个树,我们就找从根节点向下遍历方向的终点的距离与先返回父节点再从最优的父节点沿着原来的方向的终点的距离的最大值 如图所示 也就是说,我们需要获得当前点的正距离最大值和正距离最…...
【第四十周】文献阅读:用于检索-增强大语言模型的查询与重写
目录 摘要Abstract用于检索-增强大语言模型的查询与重写研究背景方法论基于冻结LLM的重写方案基于可训练重写器的方案重写器预热训练(Rewriter Warm-up)强化学习(Reinforcement Learning) 创新性实验结果局限性总结 摘要 这篇论文…...
Istio常用命令
Istio常用命令 1. 安装和配置2. Sidecar 注入3. 验证和状态4. 升级和卸载5. 故障排除6. 配置管理 istioctl 的常用命令及其详细说明: 1. 安装和配置 安装 Istio # 使用指定的配置文件(如 demo)安装 Istio 到 Kubernetes 集群。 istioctl m…...
Linux基础15
一、网络模型 二、eNSP模拟器 拖拽操作建立模拟网络环境 交换机视图操作: <> 用户视图 [] 系统视图 接口视图 协议视图 display version #显示版本和设备型号 display current-configuration #查看设备配置(查错) …...
FISCO BCOS群组扩容实战指南:从原理到操作全解析
引言:为什么需要群组扩容? 在区块链技术迅猛发展的今天,企业级应用对区块链平台提出了更高的要求。"如何在不影响现有业务的情况下扩展区块链处理能力?"、"能否实现不同业务数据的物理隔离?"、&qu…...
【pytorch图像视觉】lesson17深度视觉应用(上)构建自己的深度视觉项目
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 数据1、认识经典数据1.1入门数据:MNIST、其他数字与字母识别(1)数据加载(2)查看数据的特征和标…...
从“被动跳闸”到“主动预警”:智慧用电系统守护老旧小区安全
安科瑞顾强 近年来,老旧小区电气火灾事故频发,成为威胁居民生命财产安全的重要隐患。据统计,我国居住场所火灾伤亡人数远超其他场所,仅今年一季度就发生8.3万起住宅火灾,造成503人遇难。这些建筑多建于上世纪&#x…...