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)
}