You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在不依赖sqlite3或rusqlite的情况下从其他函数启动arti-client?

如何在不依赖sqlite3或rusqlite的情况下从其他函数启动arti-client?

嘿,我来帮你搞定这个问题!你不想依赖sqlite3/rusqlite的想法完全合理——带额外的DLL确实麻烦,而且arti其实提供了绕开它的方案,咱们一步步来解决:

第一步:排除arti-client的sqlite默认依赖

arti-client的默认特性集合里包含了sqlite存储,这就是你遇到链接错误的根源。咱们在Cargo.toml里显式禁用默认特性,只启用咱们需要的、不依赖sqlite的特性:

arti-client = { version = "0.17.0", default-features = false, features = ["tokio-runtime", "native-tls", "in-memory-storage"] }
  • tokio-runtime:arti基于Tokio运行时,这个特性是必须的(如果你用async-std也可以换成async-std-runtime
  • native-tls:提供TLS加密支持,用于访问HTTPS目标
  • in-memory-storage:启用内存存储代替磁盘上的sqlite数据库,完全绕开sqlite依赖

第二步:手动构建无sqlite的arti-client

接下来,咱们在函数里手动配置arti-client,指定使用内存存储,这样就能从任意函数初始化它,然后连接多个目标主机:

use arti_client::{ArtiClient, ArtiClientBuilder, config::ClientConfig};
use tor_config::resolve::Resolve;
use std::sync::Arc;
use anyhow::Result;

// 封装一个专门的初始化函数,你可以在任何地方调用它
async fn init_arti_client() -> Result<Arc<ArtiClient>> {
    // 加载默认配置,然后修改存储相关设置
    let mut config = ClientConfig::default()?;
    
    // 禁用磁盘存储目录,完全改用内存存储
    config.storage.dir = None;
    config.storage.use_memory = true;

    // 解析并验证配置,确保所有设置生效
    let resolved_config = config.resolve()?;

    // 构建并返回arti client实例
    let client = ArtiClientBuilder::from_config(resolved_config)
        .await?
        .build()
        .await?;

    Ok(Arc::new(client))
}

// 示例:在业务函数里使用初始化好的client连接多个目标
async fn connect_multiple_hosts() -> Result<()> {
    let client = init_arti_client().await?;

    // 连接第一个目标主机
    let resp1 = client.get("https://example.onion").send().await?;
    println!("第一个目标响应状态: {}", resp1.status());

    // 连接第二个目标主机
    let resp2 = client.get("https://another-onion-site.onion").send().await?;
    println!("第二个目标响应状态: {}", resp2.status());

    Ok(())
}

第三步:解决链接错误

你之前遇到的LINK错误,本质是因为arti默认会链接sqlite的库文件。现在咱们禁用了默认特性,只启用了内存存储相关特性,编译时就不会再尝试链接sqlite的DLL了,这个错误自然会消失。

一些额外注意事项

  • 内存存储的代价:每次重启arti-client都要重新下载Tor网络的共识数据,第一次启动会慢一点,但如果你的程序是短期运行或者不需要持久化Tor状态,这完全不是问题
  • 按需添加特性:如果需要洋葱服务的其他功能,比如作为服务端,要确保选的是不依赖sqlite的特性(避开包含sqlite的特性项)
  • 配置灵活性:你还可以根据需求调整其他配置项,比如代理设置、日志级别等,都可以在ClientConfig里修改

内容来源于stack exchange

火山引擎 最新活动