2016-07-24 169 views
0

我想UDP數據包發送到遠程主機這樣發送UDP數據包gopacket

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。爲什麼我的代碼不能讀取這些數據包?

回答