在GO中获取传入的TTL

时间:2018-04-30 23:23:28

标签: go networking udp ip

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

1 个答案:

答案 0 :(得分:1)

设置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
        }
    }