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

单位网站制作费用报价单/搜什么关键词你都懂的

单位网站制作费用报价单,搜什么关键词你都懂的,舆情分析报告范文,宝塔搭建wordpress博客mediasoup 提供了多种 transport,包括 WebRtcTransport、PipeTransport、DirectTransport、PlainTransport 等,用来实现不同目的和场景的媒体通信。WebRtcTransport 是 mediasoup 实现与 WebRTC 客户端进行媒体通信的对象,是 mediasoup 最重要…

mediasoup 提供了多种 transport,包括 WebRtcTransport、PipeTransport、DirectTransport、PlainTransport 等,用来实现不同目的和场景的媒体通信。WebRtcTransport 是 mediasoup 实现与 WebRTC 客户端进行媒体通信的对象,是 mediasoup 最重要也是最复杂的 transport,理解了 WebRtcTransport 的设计与实现,再去分析其他类型 transport 会简单很多。

1. 静态结构

WebRtcTransport 可以创建独立通信端口,也可以共享 WebRtcServer 上的通信端口,从安全和运维复杂度来讲,大部分场景都应该选择第二种方式,本文主要分析第二种实现方式。

1.1. WebRtcTransport

1.1.1. 接口继承

1)Transport

这是所有 transport 的基类,代表与具体协议无关的通信端口,它封装了通信端口参与上层数据交换的公共能力,比如如何与 router、producer、consumer 的关联与交互等。

2)UdpSocket::Listener

WebRtcTransport 建立独立通信端口时,接收 UDP 数据。

class Listener
{
public:virtual void OnUdpSocketPacketReceived(RTC::UdpSocket* socket, const uint8_t* data, size_t len, const struct sockaddr* remoteAddr) = 0;
};

3)TcpServer::Listener

WebRtcTransport 建立独立通信端口时,处理 TCP 连接关闭。

class Listener
{
public:virtual void OnRtcTcpConnectionClosed(RTC::TcpServer* tcpServer, RTC::TcpConnection* connection) = 0;
};

4)TcpConnection::Listener

WebRtcTransport 建立独立通信端口时,接收 TCP 数据。

class Listener
{
public:virtual void OnTcpConnectionPacketReceived(RTC::TcpConnection* connection, const uint8_t* data, size_t len) = 0;
};

5)IceServer::Listener

ICE 交互相关回调,具体见注释。

class Listener
{
public:// 通知发送 stun 报文virtual void OnIceServerSendStunPacket(const RTC::IceServer* iceServer, const RTC::StunPacket* packet, RTC::TransportTuple* tuple) = 0;// 通知添加/删除 ufrag,主要用于 WebRtcServer stun 报文路由virtual void OnIceServerLocalUsernameFragmentAdded(const RTC::IceServer* iceServer, const std::string& usernameFragment) = 0;virtual void OnIceServerLocalUsernameFragmentRemoved(const RTC::IceServer* iceServer, const std::string& usernameFragment) = 0;// 通知添加/删除 tuple,用于 WebRtcServer 非 stun 报文路由virtual void OnIceServerTupleAdded(const RTC::IceServer* iceServer, RTC::TransportTuple* tuple) = 0;virtual void OnIceServerTupleRemoved(const RTC::IceServer* iceServer, RTC::TransportTuple* tuple) = 0;virtual void OnIceServerSelectedTuple(const RTC::IceServer* iceServer, RTC::TransportTuple* tuple)        = 0;// WebRTC 客户端与服务器通信端口连接状态变化通知virtual void OnIceServerConnected(const RTC::IceServer* iceServer)    = 0;virtual void OnIceServerCompleted(const RTC::IceServer* iceServer)    = 0;virtual void OnIceServerDisconnected(const RTC::IceServer* iceServer) = 0;
};

6)DtlsTransport::Listener

DTLS 相关回调,详见注释。

class Listener
{
public:// 接收方向协商成功virtual void OnDtlsTransportConnecting(const RTC::DtlsTransport* dtlsTransport) = 0;// 双向协商成功virtual void OnDtlsTransportConnected(const RTC::DtlsTransport* dtlsTransport,RTC::SrtpSession::CryptoSuite srtpCryptoSuite,uint8_t* srtpLocalKey,size_t srtpLocalKeyLen,uint8_t* srtpRemoteKey,size_t srtpRemoteKeyLen,std::string& remoteCert) = 0;// 连接失败或异常中断virtual void OnDtlsTransportFailed(const RTC::DtlsTransport* dtlsTransport) = 0;// 对方关闭 DTLS 连接(close_notify alert)virtual void OnDtlsTransportClosed(const RTC::DtlsTransport* dtlsTransport) = 0;// 向对端发送 DTLS 数据(DTLS协议交互)virtual void OnDtlsTransportSendData(const RTC::DtlsTransport* dtlsTransport, const uint8_t* data, size_t len) = 0;// 收到 DTLS 应用层数据virtual void OnDtlsTransportApplicationDataReceived(const RTC::DtlsTransport* dtlsTransport, const uint8_t* data, size_t len) = 0;
};

1.1.2. 重要属性

1)webRtcTransportListener

主要用于 WebRtcTransport 通知 WebRtcServer 相关信息用来建立数据路由。

class WebRtcTransportListener
{
public:virtual void OnWebRtcTransportCreated(RTC::WebRtcTransport* webRtcTransport) = 0;virtual void OnWebRtcTransportClosed(RTC::WebRtcTransport* webRtcTransport)  = 0;// ICE 协议交互阶段需要使用 ufrag 来建立路由virtual void OnWebRtcTransportLocalIceUsernameFragmentAdded(RTC::WebRtcTransport* webRtcTransport, const std::string& usernameFragment) = 0;virtual void OnWebRtcTransportLocalIceUsernameFragmentRemoved(RTC::WebRtcTransport* webRtcTransport, const std::string& usernameFragment) = 0;// ICE 协议交互完成后需要使用 TransportTuple 来建立路由virtual void OnWebRtcTransportTransportTupleAdded(RTC::WebRtcTransport* webRtcTransport, RTC::TransportTuple* tuple) = 0;virtual void OnWebRtcTransportTransportTupleRemoved(RTC::WebRtcTransport* webRtcTransport, RTC::TransportTuple* tuple) = 0;
};

2)iceServer

处理 ICE 协议交互,确定用于通信的 TransportTuple。

3)udpSockets

WebRtcTransport 建立独立通信端口的 UDP socket。

4)tcpServers

WebRtcTransport 建立独立通信端口的 TCP 监听器。

5)dtlsTransport

处理 DTLS 协商,协商得到 SRTP 所需的加解密参数。

6)srtpRecvSession

用于接收方向的 SRTP 解密。

7)srtpSendSession

用于发送方向的 SRTP 加密。

1.2. IceServer

1.2.1. 重要属性

1)usernameFragment 和 password

本端生成的随机值,对应 SDP 中的 ice-ufrag 和 ice-pwd

2)oldUsernameFragment 和 oldPassword

用来协助处理 ICE 重协商。

2)consentTimeoutMs

客户端需要定时发送 Bind 请求进行保活,这是相关超时设置。

4)state

ICE 协商状态,具体见下面的状态机分析。

enum class IceState
{NEW = 1,CONNECTED,COMPLETED,DISCONNECTED,
};

5)remoteNomination

正常情况是使用 USE-CANDIDATE 属性来选择用来通信的 candidate,当没有 USE-CANDIDATE 属性时,但携带了 NOMINATION 属性,则可以使用 nomination 来选择通信 candidate,值越大地址优先级越高。

6)tuples

保存接收到客户端所有 BIND 请求的地址。

7)selectedTuple

最终选择使用的通信地址对。

1.2.2. 重要方法

1)ProcessStunPacket

WebRtcTransport 调用,用来处理 BIND 请求。

2)RestartIce

当客户端发起 ICE 重协商时调用此接口,此时会重新生成 ufrag 和 pwd。

1.3. DtlsTransport

DtlsTransport 用来处理 DTLS 协议交互,完成身份验证和密钥协商。一旦 DTLS 完成握手并协商好密钥,后续RTP报文就不再通过 DTLS 处理,而是通过 SRTP 进行加密和解密。

1.3.1. 重要属性

1)listener

用来通知 DTLS 连接状态,DTLS 协议报文需要经过 WebRtcTransport 发送,另外, SCTP报文会被封装在DTLS报文中进行传输,通过 OnDtlsTransportApplicationDataReceived 回调收到的 SCTP 数据。

2)ssl

处于 SSL 协议交互的 OpenSSL 对象。

3)state

DTLS 连接状态,具体见 DTLS 状态机分析。

enum class DtlsState
{NEW = 1,CONNECTING,CONNECTED,FAILED,CLOSED
};

4)localRole

DTLS 角色主要用于确定DTLS握手过程中的通信方向和权限,通常是 CLIENT 发起握手。

enum class Role
{AUTO = 1,CLIENT,SERVER
};

mediasoup 根据客户端 DTLS 角色来设置本端 DTLS 角色(调用 connectWebRtcTransport 传递),并返回协商结果给客户端。

// Set local DTLS role.
switch (dtlsRemoteRole)
{case RTC::DtlsTransport::Role::CLIENT:{this->dtlsRole = RTC::DtlsTransport::Role::SERVER;break;}// If the peer has role "auto" we become "client" since we are ICE controlled.case RTC::DtlsTransport::Role::SERVER:case RTC::DtlsTransport::Role::AUTO:{this->dtlsRole = RTC::DtlsTransport::Role::CLIENT;break;}
}

5)remoteFingerprint

保存客户端的证书指纹,用来验证 DTLS 协商时对端证书的合法性。

6)remoteCert

保存客户端的证书。

1.3.2. 重要方法

1)ProcessDtlsData

WebRtcTransport 调用此接口传入 DTLS 报文。

2)SetRemoteFingerprint

在建立 DTLS 连接之前,服务器需要调用此接口设置客户端的证书指纹,否则无法对客户端证书进行验证。

3)SendDtlsData

OpenSSL 回调需要发送协商报文,内部会调用回调 WebRtcTransport 进行发送。

4)SendApplicationData

发送 SCTP 数据。

2. 数据流

WebRtcTransport 在进行媒体通信前要经历两个阶段,第一个阶段是 ICE 协议交互,用来确定进行通信的地址对,第二个阶段是 DTLS 协议交互,用来实现身份认证和密钥协商。这两个阶段完成后才开始进行 RTP/RTCP 传输阶段,并使用 DTLS 阶段协商的密钥对淑军进行加解密。

2.1. STUN

WebRtcServer 收到 UDP 数据时,会解析报文特征,识别报文类型,然后调用 ProcessStunPacketFromWebRtcServer 处理 STUN 报文,WebRtcTransport 将 STUN 报文丢给 IceServer 处理。IceServer 处理完后,如果需要发送响应的则会回调 WebRtcTransport,WebRtcTransport 调用 TransportTuple 将报文发送出去。

但这里有个问题,WebRtcServer 如何知道 STUN 报文属于哪个 WebRtcTransport?方法是,WebRtcTransport 在创建 IceServer时,会将 ice-ufrag 与 WebRtcTransport 关联起来。WebRtcServer 通过解析 STUN 报文的 ufrag 字段找到所属 WebRtcTransport。

同时,WebRtcTransport 还会将 ICE 交互过程中所有地址对设置到 WebRtcServer,这样后续从这些地址发送过来的报文都送到关联的 WebRtcTransport 处理,不用再依赖 ufrag 字段。当然,非 STUN 报文也没有这个字段可用。

2.2. DTLS

DTLS 的数据流与 STUN 数据流类似,只是在 WebRtcTransport 会对非 STUN 数据进行解析,如果是 DTLS 协议报文会调用 DtlsTransport::ProcessDtlsData 进行处理。如果需要发送 DTLS 协议报文,也是回调 WebRtcTransport 发送。

2.3. RTP

RTP 数据流相对复杂一些,涉及到转发层的路由,如下图所示。

1)WebRtcTransport 将收到的 RTP 报文交给 Transport 处理。

2)Transport 通过报文的 SSRC 找到对应的 Producer,然后将报文交给 Producer 处理。

【注】在 Worker 上创建 Producer 时,需要传入 RtpParameters,里面包含了 SSRC、MID、RID 等信息。Worker 会将这些信息与 Producer 关联起来,当收到报文时可以基于这些信息找到对应的 Producer。

3)Producer 需要做拥塞控制、NACK、关键帧请求等相关处理。处理完后,会回调 Transport 进行后续的报文转发。

4)Transport 直接将报文转发给 Router 处理。

【注】Transport 是在 Router 上创建的,Transport 只能属于某个 Router。

5)Router 将报文转发给所有连接到 Producer 的 Consumer。

6)Consumer 也需要做拥塞控制,NACK、关键帧请求等相关处理。处理完后,会回调 Consumer 所在 Transport,将报文发送出去。

3. 补充分析

3.1. 证书指纹

证书指纹(fingerprint)用来验证对等端的合法性,有效防止中间人攻击。证书中不携带证书指纹,需要通过其他方式来传递和交换。WebRTC 在 SDP 中携带证书指纹,如下所示。fingergpinrt 分为两段,第一段为摘要算法类型,第二段为使用此摘要算法计算的证书摘要值。

a=fingerprint:sha-512 28:8D:69:62:88:27:68:0B:41:FB:BE:28:DE:63:F0:2D:7C:AA:38:72:57:58:37:D4:BD:B9:BE:01:9D:A1:AF:86:1D:BB:9F:36:76:04:A8:0D:24:80:5C:08:D7:70:0D:BA:54:06:CC:48:27:52:DE:00:CD:72:B3:1A:E6:15:F1:7D

mediasoup 的证书指纹通过 connectWebRtcTransport 流程传递到 Worker,如下图所示:

证书指纹的计算方式可以简单的描述为:基于 X509 规范对证书内容使用指定的哈希算法计算摘要。

ret = X509_digest(certificate, hashFunction, binaryFingerprint, &size);

在 DTLS 握手过程中,Worker 会验证对等端的证书与设置的指纹是否匹配, 如果匹配,则验证通过,握手继续进行;如果不匹配,则握手失败,连接终止。

3.2. 密钥协商

mediasoup 预置支持的加密套件如下所示:

std::vector<DtlsTransport::SrtpCryptoSuiteMapEntry> DtlsTransport::srtpCryptoSuites =
{{ RTC::SrtpSession::CryptoSuite::AEAD_AES_256_GCM,        "SRTP_AEAD_AES_256_GCM"  },{ RTC::SrtpSession::CryptoSuite::AEAD_AES_128_GCM,        "SRTP_AEAD_AES_128_GCM"  },{ RTC::SrtpSession::CryptoSuite::AES_CM_128_HMAC_SHA1_80, "SRTP_AES128_CM_SHA1_80" },{ RTC::SrtpSession::CryptoSuite::AES_CM_128_HMAC_SHA1_32, "SRTP_AES128_CM_SHA1_32" }
};

通过下面代码设置将支持的 SRTP 的加密套件设置到 SSL。

// 设置SRTP加密套件
ret = SSL_CTX_set_tlsext_use_srtp(DtlsTransport::sslCtx, dtlsSrtpCryptoSuites.c_str());

最终协商结果是两套密钥(盐),客户端和服务器使用独立的密钥进行加密。

// Create the SRTP local master key.
std::memcpy(srtpLocalMasterKey, srtpLocalKey, srtpKeyLength);
std::memcpy(srtpLocalMasterKey + srtpKeyLength, srtpLocalSalt, srtpSaltLength);// Create the SRTP remote master key.
std::memcpy(srtpRemoteMasterKey, srtpRemoteKey, srtpKeyLength);
std::memcpy(srtpRemoteMasterKey + srtpKeyLength, srtpRemoteSalt, srtpSaltLength);

3.3. 重启 ICE

如果网络条件发生变化(例如,网络断开或切换),则可能需要重新启动ICE进程,以便重新发现和建立有效的网络连接。如下图所示,如果在 DEMO 上点击所示图标,会触发 ICE 重启。

客户端先调用服务器接口,获取服务器更新后的 ICE 参数,使用新的 ICE 参数更新 remote SDP,再进行 PeerConnection 的 SDP 重协商。

async restartIce(iceParameters: IceParameters): Promise<void> {this.assertNotClosed();// 更新 ICE 参数(ufrag/pwd)this._remoteSdp!.updateIceParameters(iceParameters);if (!this._transportReady) {return;}// SDP 重协商if (this._direction === 'send') {const offer = await this._pc.createOffer({ iceRestart: true });await this._pc.setLocalDescription(offer);const answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };await this._pc.setRemoteDescription(answer);} else {const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };await this._pc.setRemoteDescription(offer);const answer = await this._pc.createAnswer();await this._pc.setLocalDescription(answer);}
}

3.4. ICE 状态机

USE_CANDIDATE 属性用于指示特定的候选对(candidate pair)被选为用于传输。mediasoup 收到 Binding 请求如果携带 USE_CANDIDATE 属性则进入 COMPLETED 状态,否则进入 CONNECTED 状态。客户端要定时向服务器发送 binding 请求来保活,如果超时,则进入 DISCONNECTED 状态。

3.5. DTLS 状态机

DTLS 状态比较简单,在 CONNECTING 状态,如果证书验证失败、加密套件协商失败或者协商超时,都会进入 FAILED 状态。在 CONNECTED 状态如果收到关闭请求,则进入到 CLOSED 状态。DTLS 连接成功后,好像没有保活处理,看起来像是依赖于 ICE 的保活。

4. 总结

本文重点分析了 WebRtcTransport 的静态结构及重要数据流,对于理解 mediasoup 媒体转发框架非常重要。建立 WebRtcTransport 需要经历 ICE 协商和 DTLS 协商两个阶段,本文只对其中几个比较重要的逻辑进行了分析,不涉及 ICE 协商和 DTLS 协商的协议细节,如有需要请参考其他文档。

相关文章:

深入浅出mediasoup—WebRtcTransport

mediasoup 提供了多种 transport&#xff0c;包括 WebRtcTransport、PipeTransport、DirectTransport、PlainTransport 等&#xff0c;用来实现不同目的和场景的媒体通信。WebRtcTransport 是 mediasoup 实现与 WebRTC 客户端进行媒体通信的对象&#xff0c;是 mediasoup 最重要…...

如何让局域网中的其他电脑访问VMWare虚拟机上的Windows虚拟系统

场景描述 事情是这样的&#xff0c;我在我的主机&#xff08;Win10&#xff09;上搭建了一个VMWare虚拟机&#xff0c;并安装了Windows Server的虚拟系统&#xff0c;想用它来测试一些东西。但是呢&#xff0c;我发现尽管我的主机可以愉快地跟这个服务器对话&#xff0c;可办公…...

旧电脑回收前怎么清除数据

随着技术的快速更新换代&#xff0c;很多人的电脑也会不断的更新升级&#xff0c;比如给电脑升级硬件或是更换新电脑&#xff0c;从而获得更好的性能和体验。那么旧的电脑及电脑部件怎么处理更安全呢&#xff1f;我们要确保旧电脑上的个人数据被彻底清除干净&#xff0c;这样可…...

python——TinyDB

TinyDB 是一个轻量级的纯 Python 写入的文档数据库。它不需要单独的服务器进程或复杂的配置&#xff0c;只需导入模块即可开始使用。TinyDB 适合于小型项目或测试用例&#xff0c;它的数据存储在本地文件中。 TinyDB 的基本 API 和使用方式&#xff1a; 初始化数据库 from tin…...

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十八章 驱动模块编译进内核

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…...

Mailspring搭建安装教程:打造个性邮件体验

Mailspring搭建安装教程步骤&#xff01;如何选择电子邮件服务商&#xff1f; Mailspring作为一款功能强大、界面友好的邮件客户端&#xff0c;成为了许多用户的首选。AokSend将为大家提供详细的Mailspring搭建安装教程&#xff0c;帮助您打造个性化的邮件体验。 Mailspring搭…...

【分布式锁】Redission实现分布式锁

接着上一节&#xff0c;我们遇到了超卖的问题&#xff0c;并通过Redis实现分布式锁&#xff0c;进行了解决。本节 我将换一种方式实现分布式锁。 前提&#xff1a; nginx、redis、nacos 模块1&#xff1a; provider-and-consumer 端口 8023 模块2 rabbitmq-consumer 端口 8021 …...

UE4/5 对话系统

参考教程&#xff1a;UE4甜筒教艺术生学蓝图#21.UE4对话系统(1)--唠嗑案例展示_哔哩哔哩_bilibili 说来惭愧两年前看的教程&#xff0c;现在才记录一下&#xff0c;很好的教程推荐大家观看 1.首先创建两个枚举&#xff0c;内容如下 2.创建三个结构体&#xff0c;内容如下 3.再…...

Golang | Leetcode Golang题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; func hIndex(citations []int) int {n : len(citations)return n - sort.Search(n, func(x int) bool { return citations[x] > n-x }) }...

Python—面向过程编程,详细讲解(类和实例,初始化函数,类中封装数据与操作)

1.类和实例 类&#xff1a;类别 实例&#xff08;对象&#xff09;&#xff1a;类型塑造出来的某一个具体的内容 isinstance(对象&#xff0c;类) 返回一个对象是否是一个类的实例 # 声明一个整数类的实例10 a int(10) # a 10 print(type(a), isinstance(a, int)) a flo…...

Linux云计算 |【第一阶段】SERVICES-DAY2

主要内容&#xff1a; DNS服务基础及搭建、特殊解析(针对地址库文件&#xff1a;DNS轮询 DNS泛域名解析 DNS别名&#xff09;、缓存DNS&#xff08;全局转发forwarders&#xff09;、DNS递归迭代&#xff08;子域授权&#xff09;、DNS主从架构搭建、DNS主从数据同步 一、DNS工…...

el-upload照片墙自定义上传多张图片(手动一次性上传多张图片)包含图片回显,删除

需求&#xff1a;el-upload照片墙自定义上传多张图片&#xff08;手动一次性上传多张图片&#xff09;包含图片回显&#xff0c;删除&#xff0c;预览&#xff0c;在网上看了很多&#xff0c;都没有说怎么把数据转为file格式的&#xff0c;找了很久最终实现&#xff0c; 难点&a…...

三星Unpacked发布会即将举行:有新款折叠屏手机,还有智能戒指

随着7月的脚步渐近&#xff0c;科技界的目光再次聚焦于三星&#xff0c;它即将在法国巴黎举办今年的第二场Unpacked发布会。这不仅是一场新品的展示&#xff0c;更是三星对创新科技的一次深刻诠释。 从Galaxy Z Fold 6的全新设计&#xff0c;到Galaxy Z Flip 6的显著升级&…...

【Python】Matplotlib简要教程

文章目录 一、简介二、一些基本概念2.1 图表元素2.2 常见图表类型2.3 主要绘图函数及其返回值2.4 Artists 的概念 三、基本图表详解3.1 成对数据3.11 折线图&#xff1a;plot()&#x1f7e8;设置图表样式&#x1f7e8;设置各种标签&#x1f7e8;设置坐标轴&#x1f7e8;绘制子图…...

数驭未来,景联文科技构建高质大模型数据库

国内应用层面的需求推动AI产业的加速发展。根据IDC数据预测&#xff0c;预计2026年中国人工智能软件及应用市场规模会达到211亿美元。 数据、算法、算力是AI发展的驱动力&#xff0c;其中数据是AI发展的基石&#xff0c;中国的数据规模增长速度预期将领跑全球。 2024年《政府工…...

视频汇聚平台EasyCVR启动出现报错“cannot open shared object file”的原因排查与解决

安防视频监控EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。EasyCVR平台支持多种视频流的外部分发&#xff0c;如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、fmp4等&#xf…...

VMware 安装完,设备管理器中没有虚拟网卡(vmnet0、wmnet1、vmnet8) / 虚拟网络编辑器中没有桥接模式

问题&#xff1a;VMware 安装完&#xff0c;设备管理器中没有虚拟网卡(vmnet0、wmnet1、vmnet8) / 虚拟网络编辑器中没有桥接模式 1、确认 Device Install Service 和 Device Setup Manager 没有被禁用 Device Install Service 和 Device Setup Manager是 Windows 操作系统中…...

构建高效Node.js中间层:探索请求合并转发的艺术

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【CSS盒模型&#xff1a;掌握网页布局的核心】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&#x1f44d;收藏⭐评论✍ 引言&#x…...

中断和EXIT原理介绍

中断和EXIT原理介绍 一、中断的介绍&#xff1f;二、EXIT的介绍1.EXIT作用2.EXIT的详情3.EXIT中AFIO复用的作用4.STM32中AFIO复用作用 一、中断的介绍&#xff1f; 二、EXIT的介绍 EXTI&#xff08;Extern Interrupt&#xff09;外部中断 1.EXIT作用 EXTI可以监测指定GPIO口…...

vcpkg或者命令行需要设置代理时如何设置

当使用命令行或者vcpkg时&#xff0c;有时候需要设置代理来下载一些代码&#xff0c;那么可以这样&#xff1a; 本地先起一个http或者socks5的代理服务器。监听127.0.0.1:10808如果本地是http代理服务器&#xff0c;在命令行执行&#xff1a; set http_proxyhttp://127.0.0.1:…...

tensorflow安装及数据操作----学习笔记(一)

安装Miniconda 下载对应系统版本的Miniconda。我的系统是ubuntu&#xff0c;所以选择Miniconda3 Linux 64-bit。下载后执行下载的sh脚本 sh Miniconda3-latest-Linux-x86_64.sh -b执行后&#xff0c;运行conda初始化命令 ~/miniconda3/bin/conda init关闭当前命令终端&#…...

顺序表和单链表的经典算法题

目录 前言 一、基础思想&#xff08;数组&#xff09; 1. 移除元素 2.删除有序元素的重复项 3.合并两个有序数组 二、单链表算法 1.移除链表元素 2.翻转链表 3.合并两个有序的链表 前言 Hello,小伙伴们&#xff0c;今天我们来做一个往期知识的回顾&#xff0c;今天我将…...

python基础知识点(蓝桥杯python科目个人复习计划71)

做些简单题 第一题&#xff1a;确定字符串是否包含唯一字符 题目描述&#xff1a; 实现一个算法来识别一个字符串的字符是否是唯一的。 若唯一输出YES&#xff0c;否则输出NO。 输入描述&#xff1a; 输入一个字符串&#xff0c;长度不超过100. 输出描述; 输出一行&…...

【大数据专题】Flink题库

1 . 简述什么是Apache Flink &#xff1f; Apache Flink 是一个开源的基于流的有状态计算框架。它是分布式地执行的&#xff0c;具备低延迟、高吞吐的优秀性能&#xff0c;并且非常擅长处理有状态的复杂计算逻辑场景 2 . 简述Flink 的核心概念 &#xff1f; Flink 的核心概念…...

Python鲁汶意外莱顿复杂图拓扑分解算法

&#x1f3af;要点 &#x1f3af;算法池化和最佳分区搜索&#xff1a;&#x1f58a;网格搜索 | &#x1f58a;发现算法池 | &#x1f58a;返回指定图的最佳划分 | &#x1f58a;返回指定图的最佳分区 | &#x1f3af;适应度和聚类比较功能&#xff1a;&#x1f58a;图的划分 |…...

【C++】类和对象之继承

目录 继承的概念和定义 继承的概念 继承的定义 继承的定义格式 继承关系和访问限定符 继承基类成员访问方式的变化 访问权限实例 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元 继承与静态成员 复杂的菱形继承及菱形虚拟继承 继承的…...

如何在LlamaIndex中使用RAG?

如何在LlamaIndex中使用RAG 什么是 Llama-Index LlamaIndex 是一个数据框架&#xff0c;用于帮助基于 LLM 的应用程序摄取、构建结构和访问私有或特定领域的数据。 如何使用 Llama-Index ? 基本用法是一个五步流程&#xff0c;将我们从原始、非结构化数据导向基于该数据生成…...

css气泡背景特效

css气泡背景特效https://www.bootstrapmb.com/item/14879 要创建一个CSS气泡背景特效&#xff0c;你可以使用CSS的伪元素&#xff08;:before 和 :after&#xff09;、border-radius 属性来创建圆形或椭圆形的“气泡”&#xff0c;以及background 和 animation 属性来设置背景…...

7.23模拟赛总结 [数据结构优化dp] + [神奇建图]

目录 复盘题解T2T4 复盘 浅复盘下吧… 7:40 开题 看 T1 &#xff0c;起初以为和以前某道题有点像&#xff0c;子序列划分&#xff0c;注意到状态数很少&#xff0c;搜出来所有状态然后 dp&#xff0c;然后发现这个 T1 和那个毛关系没有 浏览了一下&#xff0c;感觉 T2 题面…...

MySQL-视 图

视 图 创建视图 视图是从一个或者几个基本表&#xff08;或视图&#xff09;导出的表。它与基 本表不同&#xff0c;是一个虚表。 语法&#xff1a; create view 视图名 【view_xxx/v_xxx】 说明&#xff1a; • view_name 自己定义的视图名&#xff1b; • as 后面是这…...