在 golang 中解析 icmp 消息时遇到问题
Trouble parsing icmp messages in golang
我是 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 非常乐意编译 运行 这段代码。有人能告诉我为什么类型开关中的代码工作正常,但第一个示例导致编译错误。谢谢!
message.Body
是一个 MessageBody
(https://godoc.org/golang.org/x/net/icmp#MessageBody),它是一种接口类型。如果你想要底层类型,你需要转换它。一种方法是说
body := message.Body.(*icmp.Echo)
...
这可能对您有用,但如果 MessageBody
不是 icmp.Echo
指针,那么它会引起恐慌。
类型切换确保没有恐慌。
你也可以
if body, ok := message.Body.(*icmp.Echo); ok {
// do something with Body as an *icmp.Echo type
}
防恐慌
我是 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 非常乐意编译 运行 这段代码。有人能告诉我为什么类型开关中的代码工作正常,但第一个示例导致编译错误。谢谢!
message.Body
是一个 MessageBody
(https://godoc.org/golang.org/x/net/icmp#MessageBody),它是一种接口类型。如果你想要底层类型,你需要转换它。一种方法是说
body := message.Body.(*icmp.Echo)
...
这可能对您有用,但如果 MessageBody
不是 icmp.Echo
指针,那么它会引起恐慌。
类型切换确保没有恐慌。
你也可以
if body, ok := message.Body.(*icmp.Echo); ok {
// do something with Body as an *icmp.Echo type
}
防恐慌