2 个不稳定版本

0.2.0 2022年4月20日
0.1.0 2022年4月12日

#9 in #socket-address

GPL-3.0 许可证

20KB
309 行代码(不含注释)

🦀 udpsec

Rust 中安全的 UDP 实现

示例

客户端

use udpsec::Socket;

use std::io::Write;
use std::net::SocketAddr;

fn input(prefix: &str) -> String {
    let mut input = String::new();

    print!("{}", prefix);
    
    std::io::stdout().flush();
    std::io::stdin().read_line(&mut input);

    input.trim().to_string()
}

fn main() {
    let local_addr = input("Local addr: ").parse::<SocketAddr>().unwrap();
    let remote_addr = input("Remote addr: ").parse::<SocketAddr>().unwrap();
    
    let mut socket = Socket::new(local_addr).unwrap();

    // Send shared secret generation request
    let mut awaiter = socket.generate_secret(remote_addr).unwrap();

    // Wait until it'll not be generated
    while let None = socket.shared_secret(remote_addr) {
        socket.recv();
    }

    // wait because sometimes result can return None
    println!("Ping: {} ms", awaiter.wait(None).unwrap().as_millis());

    // Input and send text
    loop {
        socket.send(remote_addr, input("> ").as_bytes().to_vec());
    }
}

服务器

use udpsec::Socket;

use std::io::Write;
use std::net::SocketAddr;

fn input(prefix: &str) -> String {
    let mut input = String::new();

    print!("{}", prefix);
    
    std::io::stdout().flush();
    std::io::stdin().read_line(&mut input);

    input.trim().to_string()
}

fn main() {
    let local_addr = input("Local addr: ").parse::<SocketAddr>().unwrap();
    
    let mut socket = Socket::new(local_addr).unwrap();

    loop {
        if let Some((from, data)) = socket.recv() {
            println!("[{}] {}", from, String::from_utf8(data).unwrap());
        }
    }
}

自定义数据编解码器

let mut socket = Socket::new(local_addr).unwrap();

socket.set_encoder(|data, key| {
    // somehow encode data

    data
});

socket.set_decoder(|data, key| {
    // somehow decode data

    data
});

作者:Nikita Podvirnyy

许可协议:GNU GPL 3.0

依赖项

~2–2.8MB
~59K SLoC