mirror of
https://github.com/andwati/dns-resolver.git
synced 2026-10-18 10:42:52 +00:00
38 lines
844 B
Go
38 lines
844 B
Go
package dns
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/binary"
|
|
"log"
|
|
)
|
|
|
|
type DNSHeader struct {
|
|
ID uint16
|
|
Flags uint16
|
|
QDCount uint16
|
|
ANCount uint16
|
|
NSCount uint16
|
|
ARCount uint16
|
|
}
|
|
|
|
// Serialize converts the DNSHeader into a byte slice
|
|
func (h *DNSHeader) Serialize() []byte {
|
|
buf := make([]byte, 12)
|
|
binary.BigEndian.PutUint16(buf[0:2], h.ID)
|
|
binary.BigEndian.PutUint16(buf[2:4], h.Flags)
|
|
binary.BigEndian.PutUint16(buf[4:6], h.QDCount)
|
|
binary.BigEndian.PutUint16(buf[6:8], h.ARCount)
|
|
binary.BigEndian.PutUint16(buf[8:10], h.NSCount)
|
|
binary.BigEndian.PutUint16(buf[10:12], h.ARCount)
|
|
return buf
|
|
}
|
|
|
|
// genertae a random 16bit identifier
|
|
func GenerateRandomID() uint16 {
|
|
var id [2]byte
|
|
if _, err := rand.Read(id[:]); err != nil {
|
|
log.Fatalf("Failed to generate random ID: %v", err)
|
|
}
|
|
return binary.BigEndian.Uint16(id[:])
|
|
}
|