How to Implement a DNS Client or Server in Go

Web
Implement a Go DNS server using net.Listen and net/dns.Server, or a client using net/dns.Client to exchange DNS messages.

Use the net package to create a server listening on a specific address and the net/dns package to handle DNS queries. The server accepts incoming connections, reads DNS packets, and writes responses back to the client.

package main

import (
	"net"
	"net/dns"
)

func main() {
	listener, err := net.Listen("udp", ":53")
	if err != nil {
		panic(err)
	}
	defer listener.Close()

	server := &dns.Server{Addr: ":53", Net: "udp"}
	server.HandleFunc(".", func(w dns.ResponseWriter, r *dns.Msg) {
		m := new(dns.Msg)
		m.SetReply(r)
		w.WriteMsg(m)
	})
	server.ListenAndServe(listener)
}

For a client, use dns.Client to send queries to a server address:

package main

import (
	"fmt"
	"net"
	"net/dns"
)

func main() {
	client := new(dns.Client)
	m := new(dns.Msg)
	m.SetQuestion("example.com.", dns.TypeA)
	resp, _, err := client.Exchange(m, "8.8.8.8:53")
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Answer)
}