使用gopacket发送UDP数据包



我正试图将UDP数据包发送到像这样的远程主机

conn, err := net.ListenPacket("ip4:udp", "0.0.0.0")
if err != nil {
    panic(err)
}
ip := &layers.IPv4{
    SrcIP:    saddr,
    DstIP:    dip,
    Protocol: layers.IPProtocolUDP,
}
udp := &layers.UDP{
    SrcPort: layers.UDPPort(sport),
    DstPort: layers.UDPPort(us.Port),
}
udp.SetNetworkLayerForChecksum(ip)
buf := gopacket.NewSerializeBuffer()
opts := gopacket.SerializeOptions{
    ComputeChecksums: true,
    FixLengths:       true,
}
if err := gopacket.SerializeLayers(buf, opts, udp); err != nil {
    fmt.Printf("%v", err)
}
if _, err := us.Conn.WriteTo(buf.Bytes(), &net.IPAddr{IP: dip}); err != nil {
    panic(err)
}
// reading
for {
    buf2 := make([]byte, 4096)
    n, addr, err := us.Conn.ReadFrom(buf2)
    if err != nil {
        fmt.Printf("%v", err)
    }
    if addr.String() == dip.String() {
        fmt.Printf("Got a reply")
    }
}

但是,在用read ip4 0.0.0.0: i/o timeout读取数据包时,这种方法总是出错。当我tcpdump时,我看到数据包被发送出去,一个UDP响应在端口53上返回,其他都是ICMP。为什么我的代码不能读取那些数据包?

我不是围棋专家,但似乎你必须使用函数网。ListenUDP并指定绑定UDP套接字的端口。然后使用该连接(从ListerUDP获得)从那里进行读取。我想你是在"sport"中指定端口53。

这里有一个客户端和服务器的简单示例:https://varshneyabhi.wordpress.com/2014/12/23/simple-udp-clientserver-in-golang/

您在示例中混合了两种不同的UDP数据包创建方法。你应该只使用一个。

第一种方法是使用Go应用程序"net"模块来准备和发送UDP数据包。这是一种常见的方式,在最常见的方式中你会使用这个。

Secand方法使用谷歌专用的"gopacket"模块来准备RAW网络数据包。这是黑客检查硬件或实现特殊协议并模拟某些特定协议栈的方法。这是创建特殊实用程序和测试应用程序的唯一专业方法。

如果你创建了新的硬件并试图与这些设备交互,你可以使用gopakcet,或者如果你简单地创建了软件应用程序,你应该使用net包。

相关内容

  • 没有找到相关文章

最新更新