Skip to content

Instantly share code, notes, and snippets.

@xionglun
Created December 29, 2016 01:40
Show Gist options
  • Save xionglun/8bf08e11190efeb7036faef2dc138b31 to your computer and use it in GitHub Desktop.
Save xionglun/8bf08e11190efeb7036faef2dc138b31 to your computer and use it in GitHub Desktop.
Golang retrieve one domain's TXT record via custom DNS.
package main
import (
"fmt"
"time"
"github.com/miekg/dns"
)
func queryTXT(resolve, domain string) (txt string) {
m := new(dns.Msg)
m.Id = dns.Id()
m.RecursionDesired = true
m.Question = make([]dns.Question, 0, 1)
q := dns.Question{fmt.Sprintf("%s.", domain), dns.TypeTXT, dns.ClassINET}
m.Question = append(m.Question, q)
in, err := dns.Exchange(m, fmt.Sprintf("%s:53", resolve))
if err != nil {
fmt.Println("Error: ", err.Error())
return ""
}
answers := in.Answer
n := len(answers)
if n < 1 {
fmt.Println("Answer error!")
} else {
if t, ok := in.Answer[0].(*dns.TXT); ok {
as := t.String()
return fmt.Sprintf("\t%s\t\tLen:%d\t%s", resolve, len(t.Txt), as)
}
}
return ""
}
func handle(list []string) {
n := len(list)
if n < 1 {
return
}
domain := "fast.com"
results := make(chan string, n)
for _, addr := range list {
go func(address string) {
start := time.Now()
res := queryTXT(address, domain)
end := time.Since(start).Nanoseconds()
results <- fmt.Sprintf("Time:%dms\t%s", (end / 1000000), res)
}(addr)
}
for {
select {
case r := <-results:
fmt.Println(r)
case <-time.After(time.Millisecond * 200):
return
}
}
}
func main() {
list := []string{
"223.5.5.5",
"223.6.6.6",
"119.29.29.29",
"180.76.76.76",
"114.114.114.114",
"114.114.115.115",
"101.226.4.6",
"202.106.196.115",
}
handle(list)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment