ЛОР, нужна консультация эксперта по сетевому программированию и IPv6. Стал ковырять реализацию UPnP на растишке. Пилю обнаружение устройств через мультикаст. Через IPv4 работает норм, с IPv6 пока фигня [читать дальше...]
В UPnP для обнаружения устройств по IPv6 юзаются два мультикаст-адреса: ff02::c и ff05::C. Пытаюсь создать сокет, чтобы получать мультикаст-пакеты:
use std::net;
static SSDP_PORT: u16 = 1900;
static SSDP_MULTICAST_ADDR: &str = "ff02::c"; // падает
// static SSDP_MULTICAST_ADDR: &str = "ff05::c"; // а так работает
fn main() {
let addr: net::Ipv6Addr = SSDP_MULTICAST_ADDR.parse().unwrap();
let socket_addr = net::SocketAddr::new(addr.into(), SSDP_PORT);
let socket = net::UdpSocket::bind(&socket_addr).expect(&format!("cannot bind to {}", socket_addr));
socket.join_multicast_v6(&addr, 0).expect(&format!("Cannot join multicast group {}", addr));
}
Со адресом ff05::c всё работает, с адресом ff02::c падает с EINVAL при попытке забиндить сокет:
cargo run --bin test ~/src/sbox/rust-multicast
Finished dev [unoptimized + debuginfo] target(s) in 0.06s
Running `target/debug/test`
thread 'main' panicked at 'cannot bind to [ff02::c]:1900: Os { code: 22, kind: InvalidInput, message: "Invalid argument" }', libcore/result.rs:945:5
Что делаю не так?