#广播 #组播 #网络 #Linux

autodiscover-rs

autodiscover-rs 实现了一种简单的算法,用于在 IP 网络上检测对等节点,连接到它们,并通过连接的流进行回调。该算法支持 UDP 广播和组播。

2 个版本

0.1.1 2020 年 7 月 8 日
0.1.0 2020 年 7 月 4 日

16#组播

自定义许可协议

11KB
103

autodiscover-rs

autodiscover-rs 实现了一种简单的算法,用于在 IP 网络上检测对等节点,连接到它们,并通过连接的流进行回调。该算法支持 UDP 广播和组播。

用法

Cargo.toml

autodiscover-rs = "0.1.0"

在您的应用程序中

use std::net::{TcpListener, TcpStream};
use std::thread;

use autodiscover_rs::{self, Method};
use env_logger;

fn handle_client(stream: std::io::Result<TcpStream>) {
    println!("Got a connection from {:?}", stream.unwrap().peer_addr());
}

fn main() -> std::io::Result<()> {
    env_logger::init();
    // make sure to bind before announcing ready
    let listener = TcpListener::bind(":::0")?;
    // get the port we were bound too; note that the trailing :0 above gives us a random unused port
    let socket = listener.local_addr()?;
    thread::spawn(move || {
        // this function blocks forever; running it a seperate thread
        autodiscover_rs::run(&socket, Method::Multicast("[ff0e::1]:1337".parse().unwrap()), |s| {
            // change this to task::spawn if using async_std or tokio
            thread::spawn(|| handle_client(s));
        }).unwrap();
    });
    let mut incoming = listener.incoming();
    while let Some(stream) = incoming.next() {
        // if you are using an async library, such as async_std or tokio, you can convert the stream to the
        // appropriate type before using task::spawn from your library of choice.
        thread::spawn(|| handle_client(stream));
    }
    Ok(())
}

注意

对等节点发现算法如下:

  • 向广播/组播地址发送一条消息,其中配置的 '监听地址' 被压缩成 6 字节(IPv4)或 18 字节(IPv6)的数据包
  • 开始在广播/组播地址上监听新消息;当一个被接收时,连接到它并运行回调

这里有几个需要注意的问题

  • 如果广播数据包丢失,某些连接将无法建立

数据包格式

我们正在广播的 IP 地址的形式是

IPv4

buff[0..4].clone_from_slice(&addr.ip().octets());
buff[4..6].clone_from_slice(&addr.port().to_be_bytes());

IPv6

buff[0..16].clone_from_slice(&addr.ip().octets());
buff[16..18].clone_from_slice(&addr.port().to_be_bytes());

待办事项

  1. 为异步框架(如 async_std 和 tokio)提供功能
  2. 找出一种测试此方法的方式
  3. 提供一种机制来停止侦听发现的线程

依赖项

~310–560KB