63 lines
1.1 KiB
Go
63 lines
1.1 KiB
Go
package node
|
|
|
|
import "net"
|
|
|
|
type LuxDnsServer struct {
|
|
node *LuxNode
|
|
stopChan chan bool
|
|
}
|
|
|
|
func NewLuxDnsServer(node *LuxNode) LuxDnsServer {
|
|
return LuxDnsServer{
|
|
node: node,
|
|
stopChan: make(chan bool),
|
|
}
|
|
}
|
|
|
|
func (sv *LuxDnsServer) HandleRequest(req []byte) []byte {
|
|
return nil
|
|
}
|
|
|
|
func (sv *LuxDnsServer) CreateFrontend(udpListen string) error {
|
|
listenAddr, err := net.ResolveUDPAddr("udp", udpListen)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
conn, err := net.ListenUDP("udp", listenAddr)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
go func(sv *LuxDnsServer) {
|
|
defer conn.Close()
|
|
|
|
buf := make([]byte, 512)
|
|
|
|
for {
|
|
select {
|
|
case <-sv.stopChan:
|
|
return
|
|
default:
|
|
n, addr, err := conn.ReadFromUDP(buf)
|
|
if err != nil {
|
|
log.Debugf("failed to recv dns udp: %v\n", err)
|
|
}
|
|
|
|
res := sv.HandleRequest(buf[:n])
|
|
if len(res) > 0 {
|
|
_, err := conn.WriteToUDP(res, addr)
|
|
if err != nil {
|
|
log.Debugf("failed to send dns reply: %v\n", err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}(sv)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (sv *LuxDnsServer) Stop() {
|
|
sv.stopChan <- true
|
|
}
|