不为失败找理由,要为成功找方法。

packetbeat中dns 解析实现

Beats | 作者 Jay | 发布于2016年07月13日 | 阅读数:6553

// 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库吗,采取了一个类似的做法,我的协议解析就都是空的。
有点没看懂,源码爱好者求解答一下啊。
已邀请:

medcl - 今晚打老虎。

赞同来自:

    err = msg.Unpack(rawData[offset:])
这句应该就是进行解析二进制数据到结构体的,你是在packetbeat里面实现DNS协议么?

要回复问题请先登录注册