使用gopacket发送UDP数据包 [英] Sending UDP packets with gopacket
问题描述
conn,err:= net.ListenPacket( ip4:udp,0.0.0.0)
if err!= nil {
panic(err)
}
ip:=& layers.IPv4 {
SrcIP:saddr,
DstIP:dip,
协议: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)
}
//读取
为{
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(有回复)
}
}
但是,当读取
我不是Go的专家,但似乎必须使用函数net.ListenUDP并指定要绑定UDP套接字的端口。然后你使用该连接(从ListeUDP获得)从那里读取。我假设你在'sport'中指定了端口53。
这里有一个客户端和服务器的简单例子: https://varshneyabhi.wordpress.com/2014/12/23/simple-udp-clientserver-in-golang/
I am trying to send UDP packets to a remote host like this
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")
}
}
But this keeps erring out while reading packets with read ip4 0.0.0.0: i/o timeout
. When I tcpdump, I see packets being sent out and one UDP response coming back on port 53 others are all ICMP. Why can't my code read those packets?
I'm not an expert in Go but it seems you have to use function net.ListenUDP and specify the port to bind the UDP socket. Then you use that connection (obtained from ListeUDP) to read from there. I assume you are specifying port 53 in 'sport'.
Here there is a simple example of a client and server: https://varshneyabhi.wordpress.com/2014/12/23/simple-udp-clientserver-in-golang/
这篇关于使用gopacket发送UDP数据包的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!