我正在嘗試以 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(())
}
它設法接收使用 eg 發送的單播訊息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在 tcpdump 中顯示為 eg ),沒有接收到資料。
我錯過了什么嗎?
uj5u.com熱心網友回復:
問題是以下幾行:
socket.join_multicast_v6(&mult, 0)?;
該手冊指出:
該函式為這個套接字指定一個新的多播組加入。地址必須是有效的多播地址,interface 是要加入/離開的介面的索引(或 0 表示任何介面)。
不幸的是,我將“任何介面”讀為“這將適用于所有介面”,這可能并非如此。
例如使用if_nametoindex("eth1")從尼克斯箱來解決介面名稱為我作業的介面索引。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/402522.html
標籤:
