【问题标题】:Receiving DHCPv6 messages in Rust在 Rust 中接收 DHCPv6 消息
【发布时间】:2021-12-31 21:42:59
【问题描述】:

我正在尝试在 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 &gt; localhost.dhcpv6-server: dhcp6 msgtype-72,但对于 dhcp6 消息(例如在 tcpdump 中显示为 IP6 fe80::20e:7bff:febb:a38a.dhcpv6-client &gt; ff02::1:2.dhcpv6-server: dhcp6 solicit),没有接收到数据。

我错过了什么吗?

【问题讨论】:

    标签: sockets networking rust udp dhcp


    【解决方案1】:

    问题出在下面一行:

    socket.join_multicast_v6(&mult, 0)?;
    

    手册指出:

    此函数指定一个新的多播组,以便此套接字加入。 该地址必须是有效的多播地址,并且接口是 要加入/离开的接口的索引(或 0 表示任何接口)。

    不幸的是,我将“任何接口”读作“这将适用于所有接口”,但事实可能并非如此。

    例如使用nix crate 中的if_nametoindex("eth1") 将接口名称解析为对我有用的接口索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多