我正在使用Golang的ICMP原始套接字。我想读取TTL,这是ReadFrom(buffer)
返回的控制消息的一部分。
奇怪的是,这个值总是nil
,是不是我遗漏了什么?
请在我的游乐场代码下面找到:
package main
import (
"fmt"
"golang.org/x/net/icmp"
"golang.org/x/net/ipv4"
)
func main() {
c, _ := icmp.ListenPacket("ip4:icmp", "")
rb := make([]byte, 1500)
for true {
n, cm, peer, _ := c.IPv4PacketConn().ReadFrom(rb)
rm, _ := icmp.ParseMessage(ipv4.ICMPTypeEchoReply.Protocol(), rb[:n])
switch rm.Type {
case ipv4.ICMPTypeEchoReply:
{
fmt.Printf("received answer from %sn", peer)
if cm != nil {
println(cm.TTL)
} else {
println("empty control message")
}
}
default:
}
}
}
最后,我发现了缺失的东西。
读取前需要设置IP套接字选项。
在我的例子中,我对TTL感兴趣,所以:
_ = c.IPv4PacketConn().SetControlMessage(ipv4.FlagTTL, true)