去和多播(特别是ospf)

时间:2017-06-08 14:49:55

标签: go

我正在尝试按如下方式侦听OSPFv2 Hello消息:

    ens192, err := net.InterfaceByName("ens192")
    if err != nil {
            return err
    }
    c, err := net.ListenPacket("ip4:89", "0.0.0.0") // ipv4 proto 89, all local interfaces
    if err != nil {
            return err
    }
    defer c.Close()

    p := ipv4.NewPacketConn(c)
    if err != nil {
            return err
    }

    allSPFRouters := net.ParseIP("224.0.0.5")
    if err := p.JoinGroup(ens192, &net.IPAddr{IP: allSPFRouters}); err != nil {
            return err
    }

    if err := p.SetControlMessage(ipv4.FlagDst|ipv4.FlagSrc|ipv4.FlagInterface, true); err != nil {
            return err
    }

    b := make([]byte, 8192)
    for {
            n, cm, src, err := p.ReadFrom(b)
            _ = n
            if err != nil {
                    return err
            }
            if cm.Dst.IsMulticast() {
                    if cm.Dst.Equal(allSPFRouters) {
                            hdr := &ospfHeader{}
                            hdr.Decode(b)
                            fmt.Printf("%s\n", hdr)
                    } else {
                            // ignore/discard
                            fmt.Printf("Received packet from: %v to %v\n", src, cm.Dst)
                            continue
                    }
            } else {
                    fmt.Printf("Not mcast\n")
            }
    }

但我只能看到本地生成的OSPF消息(即来自本地机器上的OSPF进程)。我看不到来自远程机器的任何OSPF数据包(我可以通过tcpdump看到它们)。 任何想法上面的代码有什么问题?为什么我只能看到当地的Hellos而不是远程...?

1 个答案:

答案 0 :(得分:0)

问题解决了。代码没问题 - "问题"是红帽子,还有它的火焰......