fix this server

This commit is contained in:
Miek Gieben 2011-02-11 21:29:40 +01:00
parent 58ccfe317b
commit ea49f7cca9
2 changed files with 49 additions and 26 deletions

View File

@ -18,12 +18,11 @@ package main
import (
"os"
"os/signal"
"net"
"dns"
"fmt"
"fmt"
"strconv"
"runtime"
"os/signal"
)
func reply(a net.Addr, in *dns.Msg, tcp bool) *dns.Msg {
@ -65,7 +64,7 @@ func replyUDP(c *net.UDPConn, a net.Addr, in *dns.Msg) {
if m == nil {
return
}
fmt.Fprintf(os.Stderr, "%v\n", m)
fmt.Fprintf(os.Stderr, "%v\n", m)
out, ok := m.Pack()
if !ok {
println("Failed to pack")
@ -79,7 +78,7 @@ func replyTCP(c *net.TCPConn, a net.Addr, in *dns.Msg) {
if m == nil {
return
}
fmt.Fprintf(os.Stderr, "%v\n", m)
fmt.Fprintf(os.Stderr, "%v\n", m)
out, ok := m.Pack()
if !ok {
println("Failed to pack")
@ -88,7 +87,50 @@ func replyTCP(c *net.TCPConn, a net.Addr, in *dns.Msg) {
dns.SendTCP(out, c, a)
}
func trackTCP(addr string, e chan os.Error) {
a, err := net.ResolveTCPAddr(addr)
if err != nil {
e <- err
}
l, err := net.ListenTCP("tcp", a)
if err != nil {
e <- err
}
err = dns.ServeTCP(l, replyTCP)
e <- err
return
}
func trackUDP(addr string, e chan os.Error) {
a, err := net.ResolveUDPAddr(addr)
if err != nil {
e <- err
}
l, err := net.ListenUDP("udp", a)
if err != nil {
e <- err
}
err = dns.ServeUDP(l, replyUDP)
e <- err
return
}
func main() {
dns.ListenAndServeUDP("127.0.0.1:8053", replyUDP)
e := make(chan os.Error)
go trackUDP("127.0.0.1:8053", e)
go trackTCP("127.0.0.1:8053", e)
forever:
for {
// Wait for a signal to stop
select {
case err := <-e:
fmt.Printf("Error received, stopping: %s\n", err.String())
break forever
case <-signal.Incoming:
fmt.Printf("Signal received, stopping\n")
break forever
}
}
close(e)
}

View File

@ -67,25 +67,6 @@ func ServeTCP(l *net.TCPListener, f func(*net.TCPConn, net.Addr, *Msg)) os.Error
panic("not reached")
}
// This function implements a nameserver. It should be run as a goroutines.
// The function itself starts two new goroutines (one for TCP and one for UDP)
// and for each incoming message run the ReplyTCP or ReplyUCP again as a
// goroutine.
//
// Typical usage of ListenAndServe:
//
// type myserv dns.Server
// func (s *myserv) ReplyUDP(c *net.UDPConn, a net.Addr, in []byte) {
// /* UDP reply */
// }
// func (s *myserv) ReplyTCP(c *net.TCPConn, a net.Addr, in []byte) {
// /* TCP reply */
// }
//
// var m *myserv
// ch := make(chan bool)
// dns.ListenAndServe("127.0.0.1:8053", m, ch)
// m <- true // stop the goroutine
func ListenAndServeTCP(addr string, f func(*net.TCPConn, net.Addr, *Msg)) os.Error {
a, err := net.ResolveTCPAddr(addr)
if err != nil {
@ -104,7 +85,7 @@ func ListenAndServeUDP(addr string, f func(*net.UDPConn, net.Addr, *Msg)) os.Err
if err != nil {
return err
}
l, err := net.ListenUDP("tcp", a)
l, err := net.ListenUDP("udp", a)
if err != nil {
return err
}