// We do not handle Unpack ErrTruncated for now. See https://github.com/miekg/dns/pull/281
func decodeDnsData(transport Transport, rawData []byte) (dns *mkdns.Msg, err error) {
var offset int
if transport == TransportTcp {
offset = DecodeOffset
}
// Recover from any panics that occur while parsing a packet.
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("panic: %v", r)
}
}()
msg := &mkdns.Msg{}
err = msg.Unpack(rawData[offset:])
// Message should be more than 12 bytes.
// The 12 bytes value corresponds to a message header length.
// We use this check because Unpack does not return an error for some unvalid messages.
// TODO: can a better solution be found?
if msg.Len() <= 12 || err != nil {
return nil, NonDnsMsg
}
return msg, nil
}
上述代码是dns go开源库中的,有一点不明确的是~这里面貌似没有实现解析dns二进制数据到dns结构体啊。是因为源码中使用vendor库吗,采取了一个类似的做法,我的协议解析就都是空的。
有点没看懂,源码爱好者求解答一下啊。
func decodeDnsData(transport Transport, rawData []byte) (dns *mkdns.Msg, err error) {
var offset int
if transport == TransportTcp {
offset = DecodeOffset
}
// Recover from any panics that occur while parsing a packet.
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("panic: %v", r)
}
}()
msg := &mkdns.Msg{}
err = msg.Unpack(rawData[offset:])
// Message should be more than 12 bytes.
// The 12 bytes value corresponds to a message header length.
// We use this check because Unpack does not return an error for some unvalid messages.
// TODO: can a better solution be found?
if msg.Len() <= 12 || err != nil {
return nil, NonDnsMsg
}
return msg, nil
}
上述代码是dns go开源库中的,有一点不明确的是~这里面貌似没有实现解析dns二进制数据到dns结构体啊。是因为源码中使用vendor库吗,采取了一个类似的做法,我的协议解析就都是空的。
有点没看懂,源码爱好者求解答一下啊。
1 个回复
medcl - 今晚打老虎。
赞同来自:
这句应该就是进行解析二进制数据到结构体的,你是在packetbeat里面实现DNS协议么?