我正试图向这样的远程主机发送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。为什么我的代码不能读取那些数据包?
发布于 2016-07-24 06:42:31
我不是Go方面的专家,但似乎您必须使用函数net.ListenUDP并指定绑定UDP套接字的端口。然后使用这个连接(从ListeUDP获得)从那里读取。我想您在“体育”中指定了端口53。
这里有一个简单的客户机和服务器示例:https://varshneyabhi.wordpress.com/2014/12/23/simple-udp-clientserver-in-golang/
发布于 2018-09-10 20:02:00
您可以在示例中混合使用两种不同的UDP数据包创建方法。你应该只用一个。
首先采用Go应用"net“模块编写和发送UDP数据包。这是常见的方式,在最常见的方式,你将使用这个。
Secand方法使用Google专用的"gopacket“模块来准备原始的网络数据包。这是黑客检查硬件或实现特定协议的方式,并对特定的协议栈进行仿真。这是创建特殊实用程序和测试应用程序的唯一专家方法。
您可以创建新的硬件并尝试与此设备交互,您可以使用gopakcet,或者如果您简单地创建软件应用程序,则应该使用net。
https://stackoverflow.com/questions/38547625
复制相似问题