P2P связь в Русте - PullRequest
       9

P2P связь в Русте

0 голосов
/ 09 октября 2019

Я пытаюсь написать узел P2P. Узел содержит список пиров, открывает порт прослушивания, чтобы позволить другим узлам установить канал связи, и в то же время активно пытается установить соединение с некоторыми другими выбранными узлами. Этот выбор таков, что существует единственное соединение между каждой парой узлов (не реализовано в следующем фрагменте).

Я пытаюсь добиться этого с помощью Tokio с использованием futures комбинаторов.

main.rs

use failure::Error;

pub mod networking {
    use failure::Error;

    use std::net::SocketAddr;
    use tokio::net::{TcpListener, TcpStream};
    use tokio::prelude::*;

    use crate::Config;
    use futures::Future;

    pub fn start(cfg: &Config) -> Result<(), Error> {
        let myself = cfg.myself.parse::<SocketAddr>()?;
        let others = cfg
            .others
            .iter()
            .filter_map(|s| s.parse().ok())
            .collect::<Vec<SocketAddr>>();

        let server = TcpListener::bind(&myself)?
            .incoming()
            .for_each(|socket| {
                println!("Got a socket: {:?}", socket);
                future::ok(())
            })
            .map_err(|e| eprintln!("Error connecting: {:?}", e));

        let client = TcpStream::connect(&others[0])
            .map(|socket| {
                println!("Got a socket: {:?}", socket);
            })
            .map_err(|e| eprintln!("Error connecting: {:?}", e));

        let future = server.join(client);

        tokio::run(future);

        Ok(())
    }
}

struct Config {
    myself: String,
    others: Vec<String>,
}

fn main() -> Result<(), Error> {
    let config = Config {
        myself: "127.0.0.1:2501".to_string(),
        others: vec!["127.0.0.1:2502".to_string(), "127.0.0.1:2503".to_string()],
    };
    networking::start(&config)
}

( детская площадка )

Это не работает:

error[E0271]: type mismatch resolving `<futures::future::join::Join<futures::future::map_err::MapErr<futures::stream::for_each::ForEach<tokio_tcp::incoming::Incoming, [closure@src/main.rs:23:23: 26:14], futures::future::result_::FutureResult<(), std::io::Error>>, [closure@src/main.rs:27:22: 27:64]>, futures::future::map_err::MapErr<futures::future::map::Map<tokio_tcp::stream::ConnectFuture, [closure@src/main.rs:30:18: 32:14]>, [closure@src/main.rs:33:22: 33:64]>> as futures::future::Future>::Item == ()`
  --> src/main.rs:37:9
   |
37 |         tokio::run(future);
   |         ^^^^^^^^^^ expected tuple, found ()
   |
   = note: expected type `((), ())`
              found type `()`
   = note: required by `tokio::runtime::threadpool::run`

Я понимаю, что говорит компилятор, ноЯ понятия не имею, что именно я должен исправить. Что я должен исправить, чтобы получить правильные типы?

1 Ответ

0 голосов
/ 09 октября 2019

спасибо за подсказки,

let future = server.join(client);

должно быть исправлено до

let future = server.join(client).map(|_| ())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...