我正试图接收生锈的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 ),不接收任何数据。
我漏掉了什么吗?
发布于 2022-01-02 11:40:11
问题是以下几行:
socket.join_multicast_v6(&mult, 0)?;手册规定:
此函数为此套接字指定一个新的多播组。地址必须是有效的多播地址,接口是连接/离开接口的索引(或0表示任何接口)。
不幸的是,我将“任何接口”解读为“这将适用于所有接口”,但情况可能并非如此。
例如,使用来自if_nametoindex("eth1")的尼克斯箱将接口名称解析为接口索引。
https://stackoverflow.com/questions/70545820
复制相似问题