在 Rust 中接收 DHCPv6 消息
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
,在 tcpdump 中显示为 IP6 localhost.57028 > localhost.dhcpv6-server: dhcp6 msgtype-72
,但对于 dhcp6 消息(在 tcpdump 中显示为 IP6 fe80::20e:7bff:febb:a38a.dhcpv6-client > ff02::1:2.dhcpv6-server: dhcp6 solicit
),没有收到数据。
我是不是漏掉了什么?
问题出在以下行:
socket.join_multicast_v6(&mult, 0)?;
手册指出:
This function specifies a new multicast group for this socket to join.
The address must be a valid multicast address, and interface is the
index of the interface to join/leave (or 0 to indicate any interface).
不幸的是,我将“任何接口”读作“这将适用于所有接口”,但事实可能并非如此。
例如使用 nix crate 中的 if_nametoindex("eth1")
将接口名称解析为接口索引对我有用。
我正在尝试接收 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
,在 tcpdump 中显示为 IP6 localhost.57028 > localhost.dhcpv6-server: dhcp6 msgtype-72
,但对于 dhcp6 消息(在 tcpdump 中显示为 IP6 fe80::20e:7bff:febb:a38a.dhcpv6-client > ff02::1:2.dhcpv6-server: dhcp6 solicit
),没有收到数据。
我是不是漏掉了什么?
问题出在以下行:
socket.join_multicast_v6(&mult, 0)?;
手册指出:
This function specifies a new multicast group for this socket to join. The address must be a valid multicast address, and interface is the index of the interface to join/leave (or 0 to indicate any interface).
不幸的是,我将“任何接口”读作“这将适用于所有接口”,但事实可能并非如此。
例如使用 nix crate 中的 if_nametoindex("eth1")
将接口名称解析为接口索引对我有用。