首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用gopacket发送UDP数据包

用gopacket发送UDP数据包
EN

Stack Overflow用户
提问于 2016-07-24 00:32:36
回答 2查看 2.8K关注 0票数 0

我正试图向这样的远程主机发送UDP数据包

代码语言:javascript
复制
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。为什么我的代码不能读取那些数据包?

EN

回答 2

Stack Overflow用户

发布于 2016-07-24 06:42:31

我不是Go方面的专家,但似乎您必须使用函数net.ListenUDP并指定绑定UDP套接字的端口。然后使用这个连接(从ListeUDP获得)从那里读取。我想您在“体育”中指定了端口53。

这里有一个简单的客户机和服务器示例:https://varshneyabhi.wordpress.com/2014/12/23/simple-udp-clientserver-in-golang/

票数 2
EN

Stack Overflow用户

发布于 2018-09-10 20:02:00

您可以在示例中混合使用两种不同的UDP数据包创建方法。你应该只用一个。

首先采用Go应用"net“模块编写和发送UDP数据包。这是常见的方式,在最常见的方式,你将使用这个。

Secand方法使用Google专用的"gopacket“模块来准备原始的网络数据包。这是黑客检查硬件或实现特定协议的方式,并对特定的协议栈进行仿真。这是创建特殊实用程序和测试应用程序的唯一专家方法。

您可以创建新的硬件并尝试与此设备交互,您可以使用gopakcet,或者如果您简单地创建软件应用程序,则应该使用net。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38547625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档