[英]Receiving DHCPv6 messages in Rust
我正在尝试在 rust 中接收 dhcp6 消息。 这是我现在拥有的代码:
use std::net::UdpSocket;
use std::net::Ipv6Addr;
fn main() -> std::io::Result<()> {
{
let socket = UdpSocket::bind("[::]:547")?;
let mult: Ipv6Addr = "ff02::1:2".parse().unwrap();
socket.join_multicast_v6(&mult, 0)?;
let mut buf = [0; 65_535];
let (amt, src) = socket.recv_from(&mut buf)?;
let res = parser::header(&buf).unwrap();
println!("{:?}", res);
}
Ok(())
}
它设法接收通过例如echo "Hello"| socat -t 10 - udp6:[::1]:547
发送的单播消息。 echo "Hello"| socat -t 10 - udp6:[::1]:547
,在 tcpdump 中显示为IP6 localhost.57028 > localhost.dhcpv6-server: dhcp6 msgtype-72
,但对于 dhcp6 消息(显示为例如IP6 fe80::20e:7bff:febb:a38a.dhcpv6-client > ff02::1:2.dhcpv6-server: dhcp6 solicit
in tcpdump),没有收到数据。
我错过了什么吗?
问题是以下行:
socket.join_multicast_v6(&mult, 0)?;
手册指出:
这个 function 指定了一个新的多播组供这个套接字加入。 该地址必须是有效的多播地址,interface 是加入/离开的接口的索引(或 0 表示任何接口)。
不幸的是,我将“任何接口”读作“这将适用于所有接口”,但情况可能并非如此。
例如,使用nix crate中的if_nametoindex("eth1")
将接口名称解析为接口索引对我有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.