【问题标题】:Getting incoming TTL in GO在 GO 中获取传入的 TTL
【发布时间】:2018-10-11 01:53:01
【问题描述】:

我正在为我正在进行的一个小项目而苦苦挣扎。我想在 GO 中实现功能,允许我在传出的 UDP 数据包上设置 IP 标头 TTL,然后我发送该数据包并在另一端查看接收到的 TTL。我尝试使用“net”库提供的多个连接,但到目前为止没有成功(我可以设置 TTL,但我无法读取它)。谁能建议一种发送和接收 UDP 数据包的方法,以提供对数据包 TTL 字段的访问权限?

【问题讨论】:

  • UDP 没有 TTL,这是 IP 协议的一部分。您是否尝试过使用 godoc.org/golang.org/x/net/ipv4github.com/google/gopacket 等较低级别的软件包?
  • 是的,我都使用过,我尝试过使用来自 ipv4 的 packetConn,但在收到消息之前 ip 标头仍然被剥离。我不知道如何正确使用 RawConn,如果你能告诉我如何使用 RawConn 发送/接收非常有用的 UDP 消息。

标签: go networking udp ip


【解决方案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
        }
    }

【讨论】:

    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2014-09-24
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多