[英]Difference between “p: &'a i32” and “p: &'static i32” lifetime in Rust?
[英]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.