关于local_listener 和 remote_listener

 local_listener是在一套Oracle系统上(一个主机上可以安装多套Oracle软件系统的)指定的一个监听程序[应该是在一个主机的多个账户上安装的多套Oracle软件系统公用一个local_listener,即一个主机有一个local_listener]。PMON进程将在该Oracle系统上的(后于该监听程序启动的)实例的信息注册给该监听程序,这就是所谓的动态监听功能。

             注释:具有动态监听功能的监听程序,可以监听晚于它启动的实例,不能监听早于它启动的实例,因为将实例的信息注册给该监听程序的PMON进程只有在实例启动时会去将实例的信息注册给该监听程序,其他时候不会去注册。

              local_listener有默认值的,即默认监听配置(协议为TCP,端口号为1521),所以凡有该监听配置的监听程序自动具有动态监听功能。其他监听配置的监听程序若要具有动态监听功能,就要将local_listener的监听配置改为或是附加上自己的监听配置即可。

                local_listener指定了监听配置,而实际上已有的监听程序中可以不具有这种配置或是实际上的已有的具有这种配置的监听程序还未启动,这样实际上还没有动态监听的功能。只有当具有该监听配置的监听程序启动了之后,才能具有动态监听功能。

              注释:  local_listener这个参数确切的说是指监听配置,非监听程序。它可以赋多个值,值间用冒号隔开。监听配置和监听程序两个概念不要混淆,监听程序是指具有某种监听配置的程序。

              remote_listener参数和local_listener这个参数的功能是一样的(这两个参数都是针对同一个主机(或说同一个Oracle系统)而设置的)。只不过前者定义了一台远程主机上的一个监听配置(程序),让本机上的PMON进程知道向哪个远程主机上的监听程序注册本机上的实例信息,使该远程主机能为本机的实例提供监听服务。这就是所谓的 远程动态监听功能。

           上面的文章转自http://blog.csdn.net/haiross/article/details/12772147.

对于单机系统来理解local_listener是很容易的,对于rac的一个节点,它既存在local_listener又存在remote_listener。理解起来就有些问题。我个人理解是local_listener就是本节点的listener,remote_listener是一个所有节点listener的节点池的名字。

 

要在 RustDesk 中建立 TCP 隧道,您可以使用以下步骤: 1. 首先,在您的代码中导入所需的依赖项。您需要使用 `tokio` 库来处理异步任务、`tcp_tun` 库来创建 TCP 隧道,以及其他必要的 Rust 库。 2. 创建一个 TCP 隧道的函数,该函数会监听本地端口并将所有传入的连接转发到远程服务器。您可以使用 `tokio::net::TcpListener` 来监听本地端口,并使用 `tokio::net::TcpStream` 来连接远程服务器。 3. 使用 `tcp_tun` 库中的函数来创建和管理隧道。该库提供了一些用于创建和处理隧道的函数,例如 `tcp_tun::TCP_TUNNEL`。 4. 在隧道函数中,您可以使用 `tokio::io::copy` 函数来将本地连接和远程连接进行数据交换。 这是一个简单的示例代码,演示如何在 RustDesk 中建立 TCP 隧道: ```rust use tokio::io::{self, AsyncReadExt, AsyncWriteExt}; use tokio::net::{TcpListener, TcpStream}; async fn tunnel(local_port: u16, remote_ip: String, remote_port: u16) -> Result<(), Box<dyn std::error::Error>> { let listener = TcpListener::bind(("127.0.0.1", local_port)).await?; loop { let (local_socket, _) = listener.accept().await?; let remote_socket = TcpStream::connect((remote_ip.as_str(), remote_port)).await?; tokio::spawn(async move { let (mut local_reader, mut local_writer) = local_socket.split(); let (mut remote_reader, mut remote_writer) = remote_socket.split(); let local_to_remote = io::copy(&mut local_reader, &mut remote_writer); let remote_to_local = io::copy(&mut remote_reader, &mut local_writer); future::try_join(local_to_remote, remote_to_local).await }); } } #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { tunnel(8080, "remote.server.ip".to_owned(), 8080).await?; Ok(()) } ``` 请注意,此示例仅用于演示目的。在实际应用中,您可能需要根据需求进行更多的自定义和错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值