Заимствованное значение не живет достаточно долго при добавлении rustls :: Stream к вектору - PullRequest
0 голосов
/ 24 марта 2020

Я хочу создать Vec и добавить к нему соединение с открытым сокетом. Когда я запускаю код, я получаю borrowed value does not live long enough. Я видел много вопросов и ответов о переполнении стека для этой ошибки, но я не мог понять, как ее решить для rustls::Streams.

После создания массива rustls::Stream я хочу использовать другой l oop и отправлять данные с открытыми потоками.

use rustls::{ClientConfig, ClientSession, Session, TLSError};
use std::env;
use std::fmt;
use std::sync::Arc;
use std::time::Instant;
use webpki;
use webpki_roots;

fn main() {
    let mut config = rustls::ClientConfig::new();
    config
        .root_store
        .add_server_trust_anchors(&webpki_roots::TLS_SERVER_ROOTS);
    let arc = std::sync::Arc::new(config);
    let mut connectors = Vec::new();

    let now = Instant::now();
    {
        for n in 1..=2 {
            let mut socket = std::net::TcpStream::connect("X.X.X.X:443").unwrap();
            let dns_name = webpki::DNSNameRef::try_from_ascii_str("X.com").unwrap();
            let mut client = rustls::ClientSession::new(&arc, dns_name);
            let mut stream = rustls::Stream::new(&mut client, &mut socket); // Create stream
            connectors.push(stream);
        }
    }
    let elapsed = now.elapsed();
    println!("Elapsed: {:?}", elapsed);

    //AND LATER I'M GONNA ITERATE THROUGH THE VECTOR AND USE IT TO SEND DATA.
}

Ошибка:

error[E0597]: `client` does not live long enough
  --> src/main.rs:38:50
   |
38 |             let mut stream = rustls::Stream::new(&mut client, &mut socket); // Create stream
   |                                                  ^^^^^^^^^^^ borrowed value does not live long enough
39 |             let data_ref = &mut stream;
40 |             connectors.push(data_ref);
   |             ---------- borrow later used here
41 |         }
   |         - `client` dropped here while still borrowed

error[E0597]: `socket` does not live long enough
  --> src/main.rs:38:63
   |
38 |             let mut stream = rustls::Stream::new(&mut client, &mut socket); // Create stream
   |                                                               ^^^^^^^^^^^ borrowed value does not live long enough
39 |             let data_ref = &mut stream;
40 |             connectors.push(data_ref);
   |             ---------- borrow later used here
41 |         }
   |         - `socket` dropped here while still borrowed

error[E0597]: `stream` does not live long enough
  --> src/main.rs:39:28
   |
39 |             let data_ref = &mut stream;
   |                            ^^^^^^^^^^^ borrowed value does not live long enough
40 |             connectors.push(data_ref);
   |             ---------- borrow later used here
41 |         }
   |         - `stream` dropped here while still borrowed

1 Ответ

1 голос
/ 24 марта 2020

Используйте StreamOwned вместо:

use rustls::{ClientConfig, ClientSession, StreamOwned}; // 0.17.0
use std::{net::TcpStream, sync::Arc, time::Instant};
use webpki::DNSNameRef; // 0.21.2
use webpki_roots; // 0.19.0

fn main() {
    let mut config = ClientConfig::new();
    config
        .root_store
        .add_server_trust_anchors(&webpki_roots::TLS_SERVER_ROOTS);
    let arc = Arc::new(config);

    let now = Instant::now();
    let _connectors: Vec<_> = (0..2)
        .map(|_| {
            let socket = TcpStream::connect("X.X.X.X:443").unwrap();
            let dns_name = DNSNameRef::try_from_ascii_str("X.com").unwrap();
            let client = ClientSession::new(&arc, dns_name);
            StreamOwned::new(client, socket)
        })
        .collect();
    let elapsed = now.elapsed();

    println!("Elapsed: {:?}", elapsed);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...