簡體   English   中英

Rust 中的 P2P 通信

[英]P2P communications in Rust

我正在嘗試編寫一個 P2P 節點。 一個節點包含一個對等點列表,打開一個監聽端口讓其他節點建立通信通道,同時主動嘗試與其他一些選擇的節點建立連接。 這種選擇是這樣的,即每對節點之間只有一個連接(未在以下代碼段中實現)。

我正在嘗試使用futures組合器通過 Tokio 實現這一目標。

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`

我明白編譯器說什么,但我不知道我到底要糾正什么。 我應該更正什么才能使類型正確?

感謝您的提示,

let future = server.join(client);

必須糾正為

let future = server.join(client).map(|_| ())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM