Go语言实现简单的DNS客户端功能
package main
import ( "fmt" "net" )
func main() { // 域名 domain := 'www.baidu.com' // DNS 服务器地址 dnsServer := '114.114.114.114:53'
// 连接 DNS 服务器
conn, err := net.Dial('udp', dnsServer)
if err != nil {
fmt.Println('连接 DNS 服务器失败:', err)
return
}
defer conn.Close()
// 构造 DNS 请求
msg := make([]byte, 512)
msg[0] = 0x12 // 标识符
msg[1] = 0x34 // 标识符
msg[2] = 0x01 // 标志位:查询
msg[3] = 0x00 // 标志位:递归查询
msg[4] = 0x00 // 问题数
msg[5] = 0x01 // 回答数
msg[6] = 0x00 // 授权数
msg[7] = 0x00 // 附加数
msg[8] = 0x00 // 查询名长度
msg[9] = byte(len(domain)) // 查询名长度
// 查询名
for i := 0; i < len(domain); i++ {
msg[10+i] = domain[i]
}
msg[10+len(domain)] = 0x00 // 查询名结尾
msg[11+len(domain)] = 0x00 // 查询类型
msg[12+len(domain)] = 0x01 // 查询类别
// 发送 DNS 请求
_, err = conn.Write(msg[:13+len(domain)])
if err != nil {
fmt.Println('发送 DNS 请求失败:', err)
return
}
// 接收 DNS 响应
resp := make([]byte, 512)
n, err := conn.Read(resp)
if err != nil {
fmt.Println('接收 DNS 响应失败:', err)
return
}
// 解析 DNS 响应
if resp[0] != 0x12 || resp[1] != 0x34 {
fmt.Println('DNS 响应标识符错误')
}
if resp[2]&0x80 == 0x80 {
fmt.Println('DNS 响应:查询失败')
}
if resp[3]&0x0f == 0x03 {
fmt.Println('DNS 响应:域名不存在')
}
if resp[3]&0x0f != 0x00 {
fmt.Println('DNS 响应:其他错误')
}
// 解析 IP 地址
ip := net.IPv4(resp[n-4], resp[n-3], resp[n-2], resp[n-1])
fmt.Println('IP 地址:', ip.String())
}
原文地址: https://www.cveoy.top/t/topic/nr6W 著作权归作者所有。请勿转载和采集!