项目地址
https://github.com/rustp2p/rustp2p-transport
简介
这个库可以给每个节点分配一个IP,让节点之间使用纯rust实现的tcp/ip协议栈相互通信。 用起来和标准库UdpSocket/TcpStream API非常像。
示例
Node-A(192.168.0.2):
use tokio::io::AsyncReadExt;
use rustp2p_transport::TransportBuilder;
#[tokio::main]
async fn main() -> std::io::Result<()> {
let ip = std::net::Ipv4Addr::new(10, 0, 0, 2);
let port = 12345;
TransportBuilder::default()
.endpoint(ip)
.listen_port(port)
.build_context()
.await?;
let mut tcp_listener = tcp_ip::tcp::TcpListener::bind("0.0.0.0:8080").await?;
println!("***** tcp_listener accept *****");
loop {
let (mut stream, addr) = tcp_listener.accept().await?;
println!("***** accept stream {addr} *****");
tokio::spawn(async move {
let mut buf = vec![0; 65536];
loop {
match stream.read(&mut buf).await {
Ok(n) => {
println!("{addr}: {:?}", String::from_utf8(buf[..n].to_vec()));
}
Err(e) => {
println!("error addr={addr} {e:?}");
return;
}
}
}
});
}
}
Node-B:
use rustp2p_transport::TransportBuilder;
#[tokio::main]
async fn main() -> std::io::Result<()> {
let node_a = std::net::Ipv4Addr::new(10, 0, 0, 2);
let node_b = std::net::Ipv4Addr::new(10, 0, 0, 3);
TransportBuilder::default()
.endpoint(node_b)
// 连接Node-A的真实地址
.peers(vec!["tcp://192.168.0.2:12345".parse().unwrap()])
.build_context()
.await?;
// 之后就可以用TcpStream/UdpSocket 相互通信了
let tcp_stream = tcp_ip::tcp::TcpStream::connect(format!("{node_a}:8080")).await?;
// Use `tcp_stream` to communicate with Node A.
Ok(())
}
1
共 0 条评论, 1 页
评论区
写评论还没有评论