我是Go的新手,并试图让一个小型DNS程序工作,解析返回的A和CNAME记录。这是在使用 github.com/miekg/dns 包。
我无法理解如何正确解析 A 或 CNAME 的返回资源记录。对于 A 记录,我想获取 IP 地址并将其存储在变量中。对于返回了多个 RR 的 CNAME,我想解析“名称”和“地址”字段并存储在变量中。
我尝试过将结构转换为字符串或将其解压缩,但无济于事。任何人都可以提供任何见解,非常感谢。
下面是下面的代码。文本文件包含一行带有“www”:
package main
import (
"bufio"
"fmt"
"log"
"os"
"github.com/miekg/dns"
)
func dns_request_fwd(s string) []dns.RR {
//fmt.Println(s, " : started processing DNS request")
m1 := new(dns.Msg)
m1.Id = dns.Id()
m1.RecursionDesired = true
m1.Question = make([]dns.Question, 1)
m1.Question[0] = dns.Question{s, dns.TypeA, dns.ClassINET}
in, err := dns.Exchange(m1, "8.8.8.8:53")
if err != nil {
log.Fatal(err)
}
if len(in.Answer) > 0 {
//fmt.Println("Response greater than 0 - got something!")
//fmt.Println(in.Answer)
} else {
//fmt.Println("Empty DNS Response")
return nil
}
if _, ok := in.Answer[0].(*dns.A); ok {
//fmt.Println("Detected an 'A' record Answer. Returning RR!")
return in.Answer
} else if _, ok := in.Answer[0].(*dns.CNAME); ok {
//fmt.Println("Detected a 'CNAME' record Answer. Returning RR!")
return in.Answer
} else {
fmt.Println("Returning nil")
return nil
}
}
func main() {
f, err := os.Open("list4.txt")
if err != nil {
log.Fatal(err)
}
defer f.Close()
domain := "acme.com"
domain_lookup := "." + domain + "."
scanner := bufio.NewScanner(f)
for scanner.Scan() {
a_record := scanner.Text()
lookup := a_record+domain_lookup
fmt.Println("Looking up: ", lookup)
dreq := dns_request_fwd(lookup)
哈士奇WWW
相关分类