go - 在 GO 中获取传入的 TTL

标签 go networking udp ip

我正在努力处理一个小项目。我想在 GO 中实现允许我在传出的 UDP 数据包上设置 IP header TTL 的功能,然后我发送该数据包并在另一端查看接收到的 TTL。我尝试使用“net”库提供的多个连接,但到目前为止没有成功(我可以设置 TTL,但我无法读取它)。任何人都可以建议一种发送和接收提供对数据包的 TTL 字段的访问的 UDP 数据包的方法吗?

最佳答案

设置 TTL:

var conn *icmp.PacketConn

// for IPv4
conn.IPv4PacketConn().SetTTL(p.ttl) 
conn.IPv4PacketConn().SetControlMessage(ipv4.FlagTTL, true)

// for IPv6
conn.IPv6PacketConn().SetHopLimit(p.ttl) 
conn.IPv6PacketConn().SetControlMessage(ipv6.FlagHopLimit, true)

接收 TTL:

    var ttl, n int
    bytes := make([]byte, 512)
    if IPv4 {
        var cm *ipv4.ControlMessage
        n, cm, _, err = conn.IPv4PacketConn().ReadFrom(bytes)
        if cm != nil {
            ttl = cm.TTL
        }
    } else {
        var cm *ipv6.ControlMessage
        n, cm, _, err = conn.IPv6PacketConn().ReadFrom(bytes)
        if cm != nil {
            ttl = cm.HopLimit
        }
    }

关于go - 在 GO 中获取传入的 TTL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50109485/

相关文章:

go - 如何静态链接使用 crypto/tls 的 Go 二进制文件?

ios - iOS 上的/etc/hosts

sockets - 为什么绑定(bind)返回相同的临时端口?

security - UDP 与 TCP 安全性

linux - 将linux内核实现为路由器

c++ - 将 UDP 数据包发送到同一地址的效率

go - 使用反射附加到 go lang slice

C 回调和非 Go 线程

go - 请求 token 时获取 nil 而不是 *jwt.Token

Java - 将套接字与代理一起使用