fix this server
This commit is contained in:
parent
58ccfe317b
commit
ea49f7cca9
|
@ -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)
|
||||
}
|
||||
|
|
21
server.go
21
server.go
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue