Skip to content

Instantly share code, notes, and snippets.

@ysmood
Created December 12, 2019 20:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ysmood/ea47c261cdc611a8849e966976db666a to your computer and use it in GitHub Desktop.
Save ysmood/ea47c261cdc611a8849e966976db666a to your computer and use it in GitHub Desktop.
DNS server example
// dns server
package dnser
import (
"net"
"golang.org/x/net/dns/dnsmessage"
)
// Context ...
type Context struct {
host string
ln *net.UDPConn
}
// Server ...
func Server(host string) (*Context, error) {
conn, err := net.ListenUDP("udp", &net.UDPAddr{Port: 53})
if err != nil {
return nil, err
}
defer conn.Close()
return &Context{
host: host,
ln: conn,
}, nil
}
// Do ...
func (ctx *Context) Do() {
for {
buf := make([]byte, 512)
_, addr, _ := ctx.ln.ReadFromUDP(buf)
go ctx.handle(addr, buf)
}
}
func (ctx *Context) handle(addr *net.UDPAddr, data []byte) {
var m dnsmessage.Message
_ = m.Unpack(data)
m.Answers = []dnsmessage.Resource{
{
Header: dnsmessage.ResourceHeader{
Name: m.Questions[0].Name,
Type: dnsmessage.TypeCNAME,
Class: dnsmessage.ClassINET,
TTL: 300,
},
Body: &dnsmessage.CNAMEResource{CNAME: dnsmessage.MustNewName(ctx.host)},
},
}
data, _ = m.Pack()
ctx.ln.WriteToUDP(data, addr)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment