无法在golang中解析icmp消息

时间:2016-07-25 02:56:56

标签: go icmp

我是Golang的新手并试图做一个看起来非常简单的任务 - 在其中发送带有一些文本的ping并在我得到回复时读取该文本,但我遇到了一些事情我不明白。我已经建立了这样的ping:

 ping := icmp.Message{
    Type: ipv4.ICMPTypeEcho,
    Code: 0,
    Body: &icmp.Echo{
        ID: os.Getpid() & 0xffff,
        Seq: 1,
        Data: []byte("Hello"),
    },
}

这是上下文的套接字读取部分:

buf := make([]byte, 1500)
_, peer, err := c.ReadFrom(buf)
message, err := icmp.ParseMessage(1, buf)

这是我努力将我的数据从邮件正文中删除的原因:

body := message.Body;
fmt.Println("body.ID ", body.ID)
fmt.Println("body.Seq ", body.Seq)
fmt.Println("body.Data ", string(body.Data))

Go在构建时不满意:

./ping.go:86: body.ID undefined (type icmp.MessageBody has no field or method ID)
./ping.go:87: body.Seq undefined (type icmp.MessageBody has no field or method Seq)
./ping.go:88: body.Data undefined (type icmp.MessageBody has no field or method Data)

然而,这段代码改编自this awesome project,只能膨胀:

switch body := message.Body.(type) {
  case *icmp.Echo:
    fmt.Println("body.ID ", body.ID)
    fmt.Println("body.Seq ", body.Seq)
    fmt.Println("body.Data ", string(body.Data))
  default:
    fmt.Println("not a *icmp.Echo")
}

Go非常乐意编译并运行此代码。有人可以告诉我为什么类型开关中的代码工作正常,但第一个示例导致编译错误。谢谢!

1 个答案:

答案 0 :(得分:2)

static DWORD callTimerIf(void* instance) { Private* pvt = (Processor::Private*)instance; pvt->callTimer(); return 0; } message.Bodyhttps://godoc.org/golang.org/x/net/icmp#MessageBody),是一种接口类型。如果你想要底层类型你需要投射它。一种方法是说

MessageBody

这可能对您有用,但如果body := message.Body.(*icmp.Echo) ... 不是MessageBody指针,那么这将是一个恐慌。

类型开关确保没有恐慌。

您也可以

icmp.Echo

防范恐慌。