【Linux】网络基础与socket编程基础
一.网络发展
计算机的出现是在网络之前的。而网络产生之初就是为了解决局部计算机无法交互的问题。所以,网络在诞生之初,最先出现的就是我们的局域网LAN,用来结局局部多台计算机的通信问题。
而随着时间的推移,局域网已经不能满足我们的通信要求,于是就诞生出了广域网WAN,广域网可以将远隔千里之外的计算机连接起来。
计算机是人类的工具,而人类之间需要进行交互合作,所以这就要求计算机需要进行交互合作,也就说,网络的产生是必然的。
二.网络协议
网络的存在是为了将计算机联通起来,而计算机可能来自不同的计算机厂商,导致计算机可能有差异,所以计算机进行网络通信时就会产生出入。所以,为了解决计算机因硬件不同导致的通信障碍,就有了网络协议。
而最著名的就是ISO组织指定的OSI网络协议。OSI有7层协议,且协议之间分层。
在网络角度,OSI七层协议是非常完美的,只不过会话、表示、应用三层无法直接融入操作操作系统,所以在具体实现的时候,就将其压缩为了一层,变为5层协议。
三.TCP/IP五层协议
OSI只是给出标准,并没有具体实现。而在TCP/IP协议中,就是将最上面3层合并为了一层。
1.为什么要有tcp/ip协议?
当我们在进行本机通信的时候,我们可以将一个计算机理解为一个网络结构,计算机在运行的时候,其实就是cpu、内存、磁盘等设备直接在进行交互合作,这不过它们是通过线连接起来的。
而网络通信,就是五湖四海的计算机连接起来。这些计算机就好比我们的cpu、内存、磁盘...而网络通信与本机通信的区别就在于这个线变长了。所以这就会导致一系列问题:
- 如何处理数据
- 数据丢失怎么办
- 怎么定位目标主机位置
- 怎么解决当下我要去那里呢
所以,为了解决这上面的问题,就有了TCP/IP协议。
2.TCP/IP协议与操作系统的关系
在网络通信过程中,有可能你是Linux系统,而我们Windows系统,我们之间要进行通信,这就要求我们的网络协议栈是一致的。也就是说该协议的实现是一致的。这样才能保证不同操作系统之间的通信问题。
在传输层最出名的就是tcp协议,而网络层最出名的就是ip协议。而这两层是内置在操作系统内部的。它们整个网络协议栈的核心,所以将该网络协议栈叫做tcp/ip协议。
网络协议栈的前四层,分别用来解决刚才网络通信的4个问题:
- 应用层用来解决如何处理数据的问题
- 传输层解决数据丢失的问题
- 网络层解决定位目标主机位置的问题
- 数据链路层解决当下要去那里的问题
3.究竟什么是协议
协议其实就是一个结构体!!! 在两个主机在进行通信的时候,其实就是A主机填充结构化数据,然后通过网络协议栈发送到网络,再通过网络发送到B主机的网卡。B主机在从底向上将该结构化数据拿出来,因为该结构体是一个协议,所以AB主机都能认识,B主机就可以拿到A主机发送的结构化数据。
因为协议是分层的,所以每一层都有协议,同层之间可以认识对方的协议。
四.网络传输基本流程
1.局域网通信
0x1.mac地址
局域网中,可能会存在多个主机,我们需要确定我们的消息是发送给哪一个主机的。所以我们需要有一个东西来标识一个局域网中唯一的主机。这个东西就是mac地址,而mac地址其实是在网卡上的,mac地址一般在全球都是唯一的。
0x2.局域网通信标准
以太网、无线LAN,令牌环网
0x3.以太网进行网络通信
为了保证数据能够发给指定的主机,所以在以太网中发送数据的时候要包含对方主机的mac地址。
- 在以太网中,任意时刻,只允许一台机器向网络中发送数据
- 如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞
- 所有发送数据的主机都要进行碰撞检测和碰撞避免
- 没有交换机的情况下,一个以太网,就是一个碰撞域
- 局域网通信的过程中,一个主机发送的报文所有的主机都可以收到,主机对收到的报文确认是否是发送给自己的,通过目标mac地址判定,如果是则向上传递,反之丢弃
局域网中,所有的数据都要经过网络,所有对于以太网来说,他其实就是一个临界资源。
两个主机之间的通信,其实就是两个协议栈在通信!!因为网络通信中,数据只能通过网卡发送到网络中,而用户发送的数据必须得经过整个协议栈才能达到网卡,发送网络中。而主机B从网络中接收的数据,不是接收到就结束了,目的是为了处理数据。所以,网卡在拿到数据之后,需要按照自底向上的顺序将数据传给用户。
对于网络协议栈来说,每一层都有对应的协议,我们在发送数据的时候,要按照自顶向下的顺序对数据进行封装。对于接收端来说,网卡收到数据之后,需要自底向上对数据进行解包和分用。
对于发送的报文来说,每一层都要对报文添加本层的报头,也就是协议。在任意一层,添加的报头叫做协议报头,剩下的部分都是有效载荷。
对于接收端来说,拿到报文之后,首先要对报文进行解包,即将本层的协议包头与有效载荷分离,然后在进行分用,即将有效载荷传递给上层协议。
因为同层之间有相同的协议,所以是可以根据协议报头进行解包和分用的。在整个通信过程来看,可以认为是同层之间在进行通信。
细节1:为什么在发送报文的时候要进行自顶向下进行封装?
发送数据到网络中,只能通过网卡发送,并且OS系统是网卡的管理者,所以发送数据必须经过操作系统,而贯穿了操作系统也就意味着贯穿了整个协议栈。之所以要进行封装是因为,添加了协议报头,在接受端的每一层都能够识别和正确接收数据。
细节2:不考虑应用层协议,所以的协议的报头必须具有能和有效载荷分离的能力。报头中必须包含如何将自己的有效载荷交给上层的某个具体协议。(同层之间可能有多个协议,所以在传递时要传递给指定的协议)
细节3:底层收到报文,发现不是发给我的,在数据链路层直接对报文进行丢弃。
网卡有一种混杂模式,开启之后,底层就会将所有收到的数据都进行解包和分用,不管数据是不是发送给我的。
为什么要将不同层的网络协议称为网络协议栈?
发送数据的过程要进行封装,而封装的过程其实就是进行压栈的过程,而接收数据,对数据进行解包和分用其实就是弹栈的过程。
2.跨网络通信
0x1.ip地址
ip地址是在全球范围内,用来标识唯一的一台主机的。但mac地址不也是标识唯一主机的么?两这有什么区别么?
简单理解:ip地址是长期目标,mac地址是短期目标。
在跨网络通信的时候,我们要发送数据给其他主机时,发送的数据中要包含自己的ip地址和对方主机的ip地址。但两个主机并不在同一个局域网中,所以无法直接发送。所以,我们发送的消息还包含下一个要去的位置的mac地址。比如是一个路由器。由该路由器,在发送到目标主机。
总结:源id,目的ip---从哪里来,到哪里去
源mac,目的mac---上一次从哪里来,接下来要到那里去。
ip分为ipv4和ipv6,ipv4地址是一个4字节的整数,32位;ipv6地址是16字节,128位。已经有了ipv4,为什么还要由ipv6呢?
ipv6其实是为了用来解决ipv4地址不足的问题。但目前ipv6并没有普遍,当前使用最多的是公网内网来解决ipv4地址不足的问题。
0x2.跨网络通信的过程
我们现在的广域网其实是在局域网的基础上建立起来的。我们在跨网络通信的时候,有可能两台主机位于不同类型的局域网中,而我们在数据传递的时候,就要借助路由器来连接两个局域网。
跨网络传输中,数据会发送给当前主机所在局域网中的所有主机,但没有目标主机的ip地址,所以此时主机就会将目标mac地址设置为路由器,由该路由器拿着源ip地址和目标ip地址,在该路由器连接的另一片局域网中查找,如果找到了,就将源mac地址设为自己的mac地址,目标mac地址设为目标主机的mac地址。这样就完成了一次跨网络通信。 再来结合封装,解包和分用来体会跨网络传输的过程。可以看到,ip地址在数据传递的时候是一直保持不变的,mac地址一直在发生变化。mac地址只在本局域网内有效。
所以,我们在跨网络通信其实就是一直在爬楼梯。
五.socket编程
在系统层面,进程是用户运行起来的程序,本质上是为了帮助人去完成某种任务的。所以,在系统层面,只要进程拿到了数据,本质上就是人拿到了数据。
而在网络部分,将数据发送到主机并不是目的,最终的目的是要对这些数据进行处理。而处理数据是用户进行处理的,而进程是人类的代表,所以最终就要将这些数据交给进程来处理。
总结:网络通信的本质,其实就是两个不同主机上的进程在进行数据交互,在本质,其实就是进程间通信。而进程间通信的前提条件是人不同的进程看到同一份资源,而在网络通信中,这同一份资源就是网络!!!
上网,只有两种行为:
- 从远端服务器获取数据到本地
- 将自己本地的数据推送到远端服务器
而这两种行为的本质其实就是在进程IO,将数据从内存->网卡->网络,反之也一样。
1.端口号port
在一台主机上,同时会运行着多个进程,我们在发送数据时,需要将数据交给全网唯一的一台主机上的唯一的一个进程,这样对端主机才能够处理数据。
所以,端口号就是用来标识主机上唯一的一个进程的。
- 端口号是一个2字节的16位的整数;
- 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理;
- IP地址+端口号能够标识网络中唯一的一台主机以及该主机上唯一的一个进程;
- 一个端口号只能被一个进程占用。
而端口号底层的实现原理可以认为是:在传输层协议中有一张hash表,存储的是端口号与对应进程的task_struct的对应关系。当收到报文进行解包和分用时,到了传输层,此时的传输层报头就是端口号,有效载荷就是对应的数据。这样就可以找到目标进程了。
端口号port VS pid,为什么不直接使用pid来标识唯一的进程的?
首先,不是所有的进程都要进行网络通信,如果以pid来标识,那么底层的hash表就会非常大,查询起来效率就变低了。
其次,pid是一个系统的概念,他只在本机有效。而且进程可能通过绑定多个不同的端口号,以提供不同的服务。使用pid的话,pid到进程,进程到pid都只有一条路。
最后,如果pid发生了改变,那么网络也得做出相应的改变,所以有了端口号,就让网络与系统解耦了。
端口号范围划分
- 0-1023:知名端口号,这些端口号不允许被用户绑定。 HTTP,FTP,SSH等这些广为使用的应用层协议,它们使用的端口号都是固定的。
- 1024-65535:操作系统动态分配的端口号。客户端程序的端口号,就是由操作系统从这个范围内分配的。
2.socket
ip是用来标识全网唯一的一台主机,端口号是用来标识一台主机上唯一的一个进程。所以我们使用ip+port就可以标识全网内唯一的一台主机上的唯一一个进程。
而socket = ip + port。我们将socket叫做套接字。
3.传输层典型协议代表
传输层网络协议是定义在内核中的,而操作系统内核是不允许我们普通用户访问的。所以我们要进行网络通信,就得使用操作系统提供的传输层的系统调用接口。
传输层最典型的代表就是TCP(传输控制协议)和UDP(用户数据报协议)协议。
0x1.TCP协议
- 面向连接
- 可靠性
- 面向字节流
0x2.UDP协议
- 无连接
- 不可靠
- 面向数据报
我们要理解,这里的可靠和不可靠并不是优缺点,而是协议的特点。
4.网络字节序
计算机有大端和小端之分,低位存放在低地址处,我们称之为小端,大端与之相反。
在网络通信过程中,通信的双方的机器可能不同。数据在机器中的存储方式不同,如果小端机器直接通过网络将数据发送出去,那么对端的大端机器读到的数据就是反着的。
所以,为了避免在网络通信中,因为大小端而导致的差异,TCP/IP协议规定,发送到网络中的数据必须是大端。如果是大端机器,则不用任何操作,直接收发即可;如果是小端,则在发送时要将小端转化为大端,在接受时,要将大端转化为小端。
对于下列接口:h表示host,即本机序列,n表示net,即网络序列。所以我们可以通过这些接口实现,本机序列与网络序列的互相转换。如果本机本来就是大端,则该函数不做任何操作。
#include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);uint16_t htons(uint16_t hostshort);uint32_t ntohl(uint32_t netlong);uint16_t ntohs(uint16_t netshort);
l表示长整型,s表示短整型。
5.socket接口
#include <sys/types.h>
#include <sys/socket.h>// 创建套接字 tcp/udp clien/serverint socket(int domain, int type, int protocol);// 绑定套接字信息 tcp/udp client/serverint bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);// 开始监听 tcp serverint listen(int sockfd, int backlog);// 接收请求 tcp serverint accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);// 创建连接 tcp clientint connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockaddr结构
我们在绑定套接字,接收请求,创建连接的时候都需要传入sockaddr这个结构,要么是客户端信息,要么就是服务器信息。
通信分为本地通信和网络通信。socket接口的设计者,为了让本地通信和网络通信都有一套相同的接口,所以就设计出了类似多态的效果。sockaddr_in用来实现网络通信,sockaddr_un用来实现本地通信。
socket = ip + port。所以在网络通信的时候,我们需要绑定套接字信息。前16位用来区别是本地还是网络通信。
所以,我们在传参的时候,直接使用sockaddr接收sockaddr_in/sockaddr_un结构,传长度时要传具体的长度,这样就可以在内部将其本来的内容转换出来。
0x1.socket
创建套接字
- domain:用来设置套接字的通信类型,是网络通信还是本地巡回。网络通信:AF_INET,本地巡回:AF_UNIX。
- type:传输数据的类型,创建UDP套接字是使用SOCK_DGRAM,创建TCP套接字使用SOCK_STREAM。因为udp面向数据报,tcp面向字节流。
- protocol:传0即可,通过前两个参数就已经可以确定创建的是那个套接字。
返回值:
On success, a file descriptor for the new socket is returned. On error, -1 is returned, and errno is set appropriately.
成功返回一个文件描述符。失败返回-1.
为什么网络通信之间要先创建套接字呢?
网络通信的数据都要通过网卡进行收发,所以,我们可以简单的理解为网络通信前需要先打开网卡,而在Linux操作系统中,一切皆文件。所以,我们将要发送的数据写入到网卡文件中,所以系统就会给我们返回一个文件描述符。
0x2.bind
绑定套接字信息,不论是客户端还是服务端,在通信之间都需要创建套接字,创建套接字之后要进行绑定,绑定自己的端口号和ip地址。
对于服务器来说:不需要将ip地址固定。如果绑定了固定的ip地址,到时候就知道收到由绑定的ip地址发来的请求。所以服务端ip地址一般绑定INADDR_ANY
对于客户端来说,不需要显式的绑定自己的ip地址和端口号。首先,在同一台主机上,操作系统是知道ip地址是多少的,不需要显式指定。其次,如果显式绑定了端口号,并且多个客户端绑定了同一个端口号,就会导致无法同时启动多个客户端。
客户端的ip地址和端口号由操作系统进行随机绑定。
- sockfd:创建套接字返回的文件描述符
- sockaddr:绑定的套接字信息,需要填写sockaddr_in结构内部的信息。
- addrlen:sockaddr_in的长度。
0x3.listen
udp是不面向连接的,tcp是面向连接的。所以,listen是tcp接口,目的是让服务器处于监听状态。服务器处于监听状态之后,就可以被外界连接。
- sockfd:那个套接字将设为监听状态。监听状态必须是面向连接的。一般是服务器进行监听。
- backlog:请求队列的长度。弱化,可以理解为底层等待连接的套接字个数。
0x4.accept
服务端获取客户端向服务端发送的连接。
- sockfd:服务端创建的套接字
- addr:输出型参数,获取连接上来的客户端信息
- addrlen:输出型参数,addr的长度。
accept的返回值也是一个文件描述符。
服务端创建的文件描述符是用来获取连接的。它不给客户端提供服务。
accept返回的文件描述符是用来给客户端提供服务的。我们后序使用accept返回的文件描述符来发送数据和接收数据。
0x5.connect
客户端用来向服务端发起连接。
- sockfd:客户端的文件描述符
- addr:自己的ip和端口信息
- addrlen:addr的长度。
相关文章:
【Linux】网络基础与socket编程基础
一.网络发展 计算机的出现是在网络之前的。而网络产生之初就是为了解决局部计算机无法交互的问题。所以,网络在诞生之初,最先出现的就是我们的局域网LAN,用来结局局部多台计算机的通信问题。 而随着时间的推移,局域网已经不能满…...
漂亮的收款打赏要饭网HTML页面源码
这是一款专为个人收款及接受打赏设计的HTML页面,其设计简洁且美观。 下载地址:漂亮的收款打赏要饭网HTML页面源码 备用地址:漂亮的收款打赏要饭网HTML页面源码...
【图书推荐】几本人工智能实用性图书
《OpenCV计算机视觉开发实践:基于Python》 《OpenCV计算机视觉开发实践:基于Python》【摘要 书评 试读】- 京东图书 《PyTorch深度学习与计算机视觉实践》 《PyTorch深度学习与计算机视觉实践(人工智能技术丛书)》(王晓华)【摘要 书评 试读…...
uniapp+vite+cli模板引入tailwindcss
目前vitecli方式用的都是官方提供的模板,vite版本还是4.14版本,较旧,而tailwindcss已经有了4版本,实际发现引入最新版会报错,因而继续使用3.3.5版本 pnpm install tailwindcss3.3.5 uni-helper/vite-plugin-uni-tail…...
【使用 C# 获取 USB 设备信息及进行通信】
文章目录 使用 C\# 获取 USB 设备信息及进行通信为什么需要获取 USB 设备信息?方法一:使用 C\# 库 (推荐)1. HidSharp2. LibUsbDotNet 方法二:直接调用 Windows API (P/Invoke)理解设备通信协议 (用于数据交换)总结 使用 C# 获取 USB 设备信息…...
Spring Cloud探索之旅:从零搭建微服务雏形 (Eureka, LoadBalancer 与 OpenFeign实战)
引言 大家好!近期,我踏上了一段深入学习Spring Cloud构建微服务应用的旅程。我从项目初始化开始,逐步搭建了一个具备服务注册与发现、客户端负载均衡以及声明式服务调用功能的基础微服务系统。本文旨在记录这一阶段的核心学习内容与实践成果…...
四维时空数据安全传输新框架:压缩感知与几何驱动跳频
四维时空数据安全传输新框架:压缩感知与几何驱动跳频 1. 引言 1.1 研究背景 随着三维感知技术(如激光雷达、超宽带定位)与动态数据流(如无人机集群、工业物联网)的快速发展,四维时空数据(三维…...
CSS相关知识补充
:root伪类 css自定义变量和var()引用自定义变量 https://developer.mozilla.org/zh-CN/docs/Web/CSS/var 在 SCSS 中,变量的声明和使用是用 $ 符号,比如: $primary-color: #ff5722;.button {color: $primary-color; }SCSS 里没有 var() 这…...
DeepSeek 赋能物联网:从连接到智能的跨越之路
目录 一、引言:物联网新时代的开启二、DeepSeek 技术揭秘2.1 DeepSeek 是什么2.2 DeepSeek 技术优势 三、DeepSeek 与物联网的融合之基3.1 物联网发展现状与挑战3.2 DeepSeek 带来的变革性突破 四、DeepSeek 在物联网的多元应用场景4.1 智慧电力:开启能源…...
谷歌量子计算机:开启计算新纪元
量子计算的黎明 原始尺寸更换图片 在科技迅猛发展的时代,量子计算作为前沿领域,正逐渐崭露头角,吸引着全球无数科研人员与科技巨头的目光。它宛如一把开启未来科技大门的钥匙,为解决诸多复杂难题提供了前所未有的可…...
桃芯ingchips——windows HID键盘例程无法同时连接两个,但是安卓手机可以的问题
目录 环境 现象 原理及解决办法 环境 PC:windows11 安卓:Android14 例程使用的是HID Keyboard,板子使用的是91870CQ的开发板,DB870CC1A 现象 连接安卓手机时并不会出现该现象,两个开发板都可以当做键盘给手机发按…...
AMC8 -- 2009年真题解析(中文解析)
Problem 1 Answer: E 中文解析: Bridget最后有4个,给了Cassie3个, 则给Cassie之前有7个。在此之前给了一半的苹果给Ann, 那么在给Anna之前,他有7*214个苹果。 因此答案是E。 Problem 2 Answer: D 中文解析࿱…...
深入解析CountDownLatch的设计原理与实现机制
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、概述 CountDownLatch是Java并发包(java.util.concurrent)中用于协调多线程同步的核心工具类,其设计目标是允许一个或…...
缓存的相关内容
缓存是一种介于数据永久存储介质与数据应用之间数据临时的存储介质 实用化保存可以有效地减少低俗数据读取的次数 (例如磁盘IO), 提高系统性能 缓存不仅可以用于提高永久性存储介质的数据读取效率,还可以提供临时的数据存储空间 spring boot中提供了缓存技术, 方便…...
JVM方法区核心技术解析:从方法区到执行引擎
方法区 方法区的内部结构 在经典方法区设计中,主要存储以下核心数据内容: 一、类型信息 方法区维护的类型信息包含以下要素: 类全称标识 类名称(含完整包路径)直接父类的完全限定名(包含完整包路径&am…...
AIbase推出全球MCP Server集合平台 收录超12万个MCP服务器客户端
2025年,AI领域迎来了一项重要的技术进展——MCP(Model Context Protocol,模型上下文协议)的广泛应用。全球MCP Server集合平台AIbase(https://mcp.aibase.cn/)应运而生,为AI开发者提供了一站式的MCP服务器和客户端整合…...
Python训练打卡Day22
复习日: 1.标准化数据(聚类前通常需要标准化) scaler StandardScaler() X_scaled scaler.fit_transform(X) StandardScaler() :这部分代码调用了 StandardScaler 类的构造函数。在Python中,当你在类名后面加上括号…...
【ALINX 实战笔记】FPGA 大神 Adam Taylor 使用 ChipScope 调试 AMD Versal 设计
本篇文章来自 FPGA 大神、Ardiuvo & Hackster.IO 知名博主 Adam Taylor。在这里感谢 Adam Taylor 对 ALINX 产品的关注与使用。为了让文章更易阅读,我们在原文的基础上作了一些灵活的调整。原文链接已贴在文章底部,欢迎大家在评论区友好互动。 在上篇…...
【数据结构入门训练DAY-35】棋盘问题
本次训练聚焦于使用深度优先搜索(DFS)算法解决棋盘上的棋子摆放问题。题目要求在一个可能不规则的nn棋盘上摆放k个棋子,且任意两个棋子不能位于同一行或同一列。输入包括棋盘大小n和棋子数k,以及棋盘的形状(用#表示可放…...
张 提示词优化(相似计算模式)深度学习中的损失函数优化技巧
失函数的解释 损失函数代码解析 loss = -F.log_softmax(logits[...
Elasticsearch 常用语法手册
🧰 Elasticsearch 常用语法手册 📚 目录 索引操作文档操作查询操作聚合查询健康与状态查看常见问题与注意事项 🔹 索引操作 查询全部索引 GET _search创建索引 PUT /es_db创建索引并设置分片数和副本数 PUT /es_db {"settings&quo…...
华宇TAS应用中间件与亿信华辰多款软件产品完成兼容互认证
近日,华宇TAS应用中间件与亿信华辰多款产品成功通过兼容互认证测试,双方产品在功能协同、性能优化及高可用性等维度实现全面适配,将为用户提供更加稳定、高效、安全的国产化解决方案。 此次认证也标志着华宇在国产化生态适配领域再添重要里程…...
AI大模型从0到1记录学习numpy pandas day24
第 1 章 环境搭建 1.1 Anaconda 1.1.1 什么是Anaconda Anaconda官网地址:https://www.anaconda.com/ 简单来说,Anaconda Python 包和环境管理器(Conda) 常用库 集成工具。它适合那些需要快速搭建数据科学或机器学习开发环境的用…...
开源GPU架构RISC-V VCIX的深度学习潜力测试:从RTL仿真到MNIST实战
点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,H卡级别算力,按量计费,灵活弹性,顶级配置,学生专属优惠。 一、开篇:AI芯片架构演变的三重挑战 (引述TPUv4采用RISC-V的行业案…...
VirtualiSurg使用SenseGlove触觉手套开发XR手术培训体验
虚拟现实和虚拟现实触觉 作为一个领先的培训平台,VirtualiSurg自2017年以来一直利用扩展现实(XR)和触觉技术,为全球医疗保健行业提供个性化的数据驱动学习解决方案。它们使医疗专业人员能够协作学习和培训,提高他们的技能,让他们…...
AbstractErrorController简介-笔记
1. AbstractErrorController简介 org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController 是 Spring Boot 提供的一个用于处理 HTTP 错误(如 404、500 等)的抽象类,用于自定义错误响应的逻辑。它是 Spring Boot…...
next.js实现项目搭建
一、创建 Next.js 项目的步骤 1、安装 npx create-next-applatest # 或 yarn create next-app # 或 pnpm create next-app 按照交互式提示配置你的项目: 输入项目名称 选择是否使用 TypeScript 选择是否启用 ESLint 选择是否启用 Tailwind CSS 选择是否使用 s…...
使用GoLang版MySQLDiff对比表结构
概述 下载地址: https://github.com/camry/mysqldiff/ 编译安装 git clone https://github.com/camry/mysqldiff.git go env -w GOPROXYhttps://goproxy.cn,direct go env -w GOPRIVATE*.corp.example.com go build .\mysqldiff.go执行对比 ./mysqldiff --sourc…...
git工具使用详细教程-------命令行和图形化工具
下载 git下载地址:https://git-scm.com/downloads TortoiseGit(图形化工具)下载地址:https://tortoisegit.org/download/ 认识git结构 工作区:存放代码的地方 暂存区:临时存储,将工作区的代码…...
失控的产品
大部分程序员很难有机会做一个新的产品,绝大多时候去一家新公司也都是在旧产品上修修补补。 笔者还是很幸运得到了开发新品的机会,从2023年开始做,中间经历了许多磕磕碰碰。 有的小伙伴从中离开,偶尔又加入1~2个人,但…...
区块链blog1__合作与信任
🍂我们的世界 🌿不是孤立的,而是网络化的 如果是单独孤立的系统,无需共识,而我们的社会是网络结构,即结点间不是孤立的 🌿网络化的原因 而目前并未发现这样的理想孤立系统,即现实中…...
ES常识9:如何实现同义词映射(搜索)
在 Elasticsearch(ES)中实现同义词映射(如“美丽”和“漂亮”),核心是通过 同义词过滤器(Synonym Token Filter) 在分词阶段将同义词扩展或替换为统一词项,从而让搜索时输入任意一个…...
aws 实践创建policy + Role
今天Cyber 通过image 来创建EC2 的时候,要添加policy, 虽然是administrator 的role, 参考Cyber 提供的link: Imageshttps://docs.cyberark.com/pam-self-hosted/14.2/en/content/pas%20cloud/images.htm#Bring 1 Step1:...
兰亭妙微B端UI设计:融合多元风格,点亮品牌魅力
在B端产品市场,独特的品牌形象是企业脱颖而出的关键。兰亭妙微专注于B端UI设计,通过融合多元风格,为企业点亮品牌魅力,助力品牌价值提升。 兰亭妙微主创团队源自清华,历经多年沉淀,积累了丰富的设计经验。…...
高项-逻辑数据模型
逻辑数据模型的核心理解 1. 定义与特点 逻辑数据模型(Logical Data Model, LDM): 是一种抽象的数据结构设计,用于描述业务实体(如客户、订单)及其关系(如“客户下单”),…...
Aquatone安装与使用
前言:aquatone工具获取网页截图,在资产收集的时候,对于网站可以起到快速浏览 michenriksen/aquatone: A Tool for Domain Flyovershttps://github.com/michenriksen/aquatone 任务一 安装chromium sudo apt install chromiumchromium -h 任务二 下载aquatone Relea…...
解读RTOS 第八篇 · 内核源码解读:以 FreeRTOS 为例
1. 引言 FreeRTOS 作为最流行的嵌入式实时操作系统之一,其内核源码简洁且功能完善。通过剖析其关键模块(任务管理、调度器、队列、内存管理和移植层),不仅能够更深入地理解 RTOS 的运行机制,还能掌握根据项目需求进行内核定制与优化的能力。本章将带你以 FreeRTOS 10.x 版…...
6、登录功能后端开发
6、登录功能后端开发 https://xiaoxueblog.com/ai/%E7%99%BB%E5%BD%95%E5%8A%9F%E8%83%BD%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91.html 1、新建用户表SQL脚本 -- CREATE DATABASE aicloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;-- 创建用户表 drop table if exi…...
「彻底卸载 Quay 容器仓库」:干净移除服务、镜像与配置的全流程指南
文章目录 🧹 第一步:停止并禁用 systemd 服务🚮 第二步:移除 Podman 容器与相关资源1. 删除 quay-app 容器2. 删除镜像(如果你想彻底清理)3. 删除挂载卷(比如 SQLite 存储) …...
C++从入门到实战(十五)String(上)介绍STL与String的关系,为什么有string类,String有什么用
C从入门到实战(十五)String(上) 前言一、STL与String的关系1. STL 是什么?2. String 是什么?3. String 与 STL 的关系 二、为什么有string类,有什么用1. 为什么需要 string 类?2. st…...
【Python 正则表达式】
Python 正则表达式通过 re 模块实现模式匹配,是文本处理的核心工具。以下是系统化指南,包含语法详解和实战案例: 一、正则基础语法 1. 元字符速查表 符号含义示例匹配结果.任意字符(除换行符)r"a.c"“abc”…...
【MySQL】第四弹——表的CRUD进阶(二)数据库设计
文章目录 🌟范式🌟表的设计💫第一范式 1NF🪐反例🪐正例 💫第二范式 2NF🪐反例🪐正例 💫第三范式 3NF🪐反例🪐正例 💫表的设计方法&…...
Unity基础学习(十五)核心系统——音效系统
目录 一、关于音频文件的导入相关 二、音频源组件Audio Source 三、Audio Listener的介绍 四、关于播放音乐的方式 五、麦克风输入相关 Microphone 类方法与属性总览 1. Start 方法 2. End 方法 3. IsRecording 方法 4. GetPosition 方法 5. devic…...
计算机视觉----常见卷积汇总
普通卷积 普通卷积大家应该都比较熟悉了,如果不熟悉的话,可以参考我之前的博客,或者去网上自行百度。这里主要想补充两个知识点。一:卷积核参数量怎么算? 二:如何高效的并行运算卷积滑窗? …...
【人工智能-agent】--Dify+Mysql+Echarts搭建了一个能“听懂”人话的数据可视化助手!
Echarts官网:https://echarts.apache.org/zh/index.html ECharts 是一个由百度团队开发的、基于 JavaScript 的开源可视化图表库,它提供了丰富的图表类型和强大的交互功能,能够帮助开发者轻松创建专业级的数据可视化应用。 核心特点 丰富的图…...
【专栏启动】开篇:为什么是 Django + Vue3?测试平台的技术选型与架构蓝图
【专栏启动】开篇:为什么是 Django Vue3?测试平台的技术选型与架构蓝图 前言一、为什么是 Django Vue3?二、测试平台的架构设计蓝图三、测试平台模块功能概述 结语 前言 一个高效、稳定、易用的测试平台,不仅能够帮助团队提升测…...
Rust 学习笔记:关于 Vector 的练习题
Rust 学习笔记:关于 Vector 的练习题 Rust 学习笔记:关于 Vector 的练习题哪个调用会报错?以下代码能否通过编译?若能,输出是?以下代码能否通过编译?若能,输出是?以下代码…...
Modbus TCP转Profinet网关:数字化工厂异构网络融合的核心枢纽
在现代工业生产中,随着智能制造和工业互联网的不断发展,数字化工厂成为了制造业升级的重要方向。数字化工厂的核心在于实现设备、数据和人的互联互通,而这其中,通信协议扮演着至关重要的角色。今天,我们就来探讨开疆智…...
精益数据分析(62/126):从客户访谈评分到市场规模估算——移情阶段的实战进阶
精益数据分析(62/126):从客户访谈评分到市场规模估算——移情阶段的实战进阶 在创业的移情阶段,科学评估用户需求与市场潜力是决定产品方向的关键。今天,我们结合Cloud9 IDE的实战经验与《精益数据分析》的方法论&…...
各类开发教程资料推荐,Java / python /golang /js等
更多资源在文末👇👇👇👇👇👇👇👇👇 1. 入门首选(易学且应用广) Python 特点:语法简洁、易读,社区资源丰富。 用途&#…...