Golang查询域名的ipv4、ipv6的ip地址

date
Apr 10, 2022
slug
Golang查询域名的ipv4、ipv6的ip地址
status
Published
tags
golang
summary
Golang查询域名的ipv4、ipv6的ip地址
type
Post
 
Golang 查询域名的ipv4、ipv6的 ip 地址
 
// GetAAAA 查询ipv6地址
// src: 需要查询的域名
// dnsService:指定域名服务器
func GetAAAA(src string, dnsService string) (dst []net.IP, err error) {
	c := dns.Client{
		Timeout: 5 * time.Second,
	}

	var lastErr error
	// retry 3 times
	for i := 0; i < 3; i++ {
		m := dns.Msg{}
		m.SetQuestion(src+".", dns.TypeAAAA)
		r, _, err := c.Exchange(&m, dnsService+":53")
		if err != nil {
			lastErr = err
			fmt.Println(err)
			time.Sleep(1 * time.Second * time.Duration(i+1))
			continue
		}

		dst = []net.IP{}
		for _, ans := range r.Answer {
			record, isType := ans.(*dns.AAAA)
			if isType {
				dst = append(dst, record.AAAA)
			}
		}
		lastErr = nil
		break
	}
	err = lastErr
	return
}

// GetA 查询ipv4地址
// src: 需要查询的域名
// dnsService:指定域名服务器
func GetA(src string, dnsService string) (dst []net.IP, err error) {
	c := dns.Client{
		Timeout: 5 * time.Second,
	}

	var lastErr error
	// retry 3 times
	for i := 0; i < 3; i++ {
		m := dns.Msg{}
		m.SetQuestion(src+".", dns.TypeA)
		r, _, err := c.Exchange(&m, dnsService+":53")
		if err != nil {
			lastErr = err
			time.Sleep(1 * time.Second * time.Duration(i+1))
			continue
		}

		dst = []net.IP{}
		for _, ans := range r.Answer {
			record, isType := ans.(*dns.A)
			if isType {
				dst = append(dst, record.A)
			}
		}
		lastErr = nil
		break
	}
	err = lastErr
	return
}

func main() {
	
	ipv6, err := GetAAAA("blog.acorn.eu.org", "8.8.8.8")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(ipv6)
	ipv4, err := GetA("blog.acorn.eu.org", "8.8.8.8")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(ipv4)

}

© acorn 2021 - 2022