Я пытаюсь написать узел 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`
Я понимаю, что говорит компилятор, ноЯ понятия не имею, что именно я должен исправить. Что я должен исправить, чтобы получить правильные типы?