5个版本

0.1.4 2022年8月26日
0.1.3 2018年12月17日
0.1.2 2018年4月28日
0.1.1 2018年4月23日
0.1.0 2018年4月22日

#109 in #udp

45 每月下载量
用于 2 crates

MIT/Apache

16KB
238

udp_sas

Build Status Crates.io

Rust中UDP套接字源地址选择

此crate为std::net::UdpSocket提供了一个扩展trait,支持输出UDP数据报的源地址选择。这对于实现绑定多个网络接口的UDP服务器很有用。

实现依赖于套接字选项IP_PKTINFO(用于IPv4)和IPV6_RECVPKTINFO(用于IPv6)。


lib.rs:

此crate为std::net::UdpSocket提供了一个扩展trait,支持输出UDP数据报的源地址选择。这对于实现绑定多个网络接口的UDP服务器很有用。

实现依赖于套接字选项IP_PKTINFO(用于IPv4)和IPV6_RECVPKTINFO(用于IPv6)。

use std::net::{UdpSocket,SocketAddr};
use udp_sas::UdpSas;

fn main() {
    demo().unwrap();
}
fn demo() -> std::io::Result<()>
{
    let mut buf = [0u8;128];

    // Create the server socket and bind it to 0.0.0.0:30012
    //
    // Note: we will use 127.0.0.23 as source/destination address
    //       for our datagrams (to demonstrate the crate features)
    //
    let srv = UdpSocket::bind_sas("0.0.0.0:30012".parse::<SocketAddr>().unwrap())?;
    let srv_addr = "127.0.0.23:30012".parse().unwrap();

    // Create the client socket and bind it to an anonymous port
    //
    // Note: we will use 127.0.0.45 as source/destination address
    //       for our datagrams (to demonstrate the crate features)
    //
    let cli = UdpSocket::bind_sas("0.0.0.0:0".parse::<SocketAddr>().unwrap())?;
    let cli_addr = SocketAddr::new(
        "127.0.0.45".parse().unwrap(),
        cli.local_addr().unwrap().port());
    assert_ne!(cli_addr.port(), 0);
    

    // send a request (msg1) from the client to the server
    let msg1 = "What do you get if you multiply six by nine?";
    let nb = cli.send_sas(msg1.as_bytes(), &srv_addr, &cli_addr.ip())?;
    assert_eq!(nb, msg1.as_bytes().len());

    // receive the request on the server
    let (nb, peer, local) = srv.recv_sas(&mut buf)?;
    assert_eq!(peer,  cli_addr);
    assert_eq!(local, srv_addr.ip());
    assert_eq!(nb,          msg1.as_bytes().len());
    assert_eq!(&buf[0..nb], msg1.as_bytes());
          
    // send a reply (msg2) from the server to the client
    let msg2 = "Forty-two";
    let nb = srv.send_sas(msg2.as_bytes(), &peer, &local)?;
    assert_eq!(nb, msg2.as_bytes().len());

    // receive the reply on the client
    let (nb, peer, local) = cli.recv_sas(&mut buf)?;
    assert_eq!(peer,  srv_addr);
    assert_eq!(local, cli_addr.ip());
    assert_eq!(nb,          msg2.as_bytes().len());
    assert_eq!(&buf[0..nb], msg2.as_bytes());
    
    Ok(())
}

依赖

~33–420KB