networking - 使用 gopacket 发送 UDP 数据包

标签 networking go network-programming gopacket

我正在尝试像这样向远程主机发送 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。为什么我的代码无法读取这些数据包?

最佳答案

我不是 Go 方面的专家,但似乎您必须使用函数 net.ListenUDP 并指定绑定(bind) UDP 套接字的端口。然后您使用该连接(从 ListeUDP 获得)从那里读取。我假设您在“运动”中指定端口 53。

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

关于networking - 使用 gopacket 发送 UDP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38547625/

相关文章:

c - 以下代码显示段错误

java - Java中如何接收多个 vector ?

java - Tcp 服务器 WritePendingException 尽管线程锁

c# - 在 C# 中获取 Windows VPN 接口(interface)

html - 如何在golang中访问内部标签 token ?

date - 无法将 "+0000 UTC"解析为 "T"。 Go utc时间解析错误

java - 如何使用 android studio 以编程方式记录 Android 设备的所有入站和出站连接

go - 多变量分配

objective-c - 使用 TCP 套接字发送多条小消息或更短消息的速度更快

qt - Qt5 如何检查 url 是否可用?