< 返回版块

vnt-dev 发表于 2025-02-21 15:07

项目地址

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 页