使用gopacket发送UDP数据包 [英] Sending UDP packets with gopacket

查看:1203
本文介绍了使用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,
协议: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(有回复)
}
}

但是,当读取读取ip4包时0.0.0.0:I / O超时。当我tcpdump,我看到数据包被发送出去,一个UDP响应返回到其他端口53是ICMP。为什么我的代码不能读取这些数据包?

解决方案

我不是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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆