使用gopacket发送UDP数据包
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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。为什么我的代码不能读取这些数据包?
答案
我不是Go的专家,但似乎你必须使用函数net.ListenUDP并指定绑定UDP套接字的端口。然后使用该连接(从ListeUDP获取)从那里读取。我假设您在'sport'中指定端口53。
这里有一个客户端和服务器的简单示例:https://varshneyabhi.wordpress.com/2014/12/23/simple-udp-clientserver-in-golang/
另一答案
您将示例两种不同的方法混合到UDP数据包创建中。你应该只使用一个。
第一种方法是使用Go应用程序“net”模块来准备和发送UDP数据包。这是常见的方式,并且以最常见的方式使用此方法。
Secand方法使用Google特殊的“gopacket”模块来准备RAW网络数据包。这是黑客检查硬件或实现特殊协议并模拟某些特定协议栈的方法。这是创建特殊实用程序和测试应用程序的唯一专家方法
您创建新硬件并尝试与此设备交互,您可以使用gopacket,或者如果您只是简单地创建软件应用程序,则应使用net package。
以上是关于使用gopacket发送UDP数据包的主要内容,如果未能解决你的问题,请参考以下文章