A better model

But now the routine seem to hang after 1 try
This commit is contained in:
Miek Gieben 2011-02-09 18:06:37 +01:00
parent 241d441371
commit 63c18cdb2e
4 changed files with 18 additions and 35 deletions

View File

@ -22,12 +22,11 @@ import (
"dns"
"fmt"
"strconv"
"dns/responder"
"runtime"
"os/signal"
)
type server responder.Server
type server dns.Server
func reply(a net.Addr, in []byte, tcp bool) *dns.Msg {
inmsg := new(dns.Msg)
@ -69,7 +68,7 @@ func reply(a net.Addr, in []byte, tcp bool) *dns.Msg {
return m
}
func (s *server) ResponderUDP(c *net.UDPConn, a net.Addr, in []byte) {
func (s *server) ReplyUDP(c *net.UDPConn, a net.Addr, in []byte) {
m := reply(a, in, false)
if m == nil {
return
@ -80,10 +79,10 @@ func (s *server) ResponderUDP(c *net.UDPConn, a net.Addr, in []byte) {
println("Failed to pack")
return
}
responder.SendUDP(out, c, a)
dns.SendUDP(out, c, a)
}
func (s *server) ResponderTCP(c *net.TCPConn, in []byte) {
func (s *server) ReplyTCP(c *net.TCPConn, a net.Addr, in []byte) {
m := reply(c.RemoteAddr(), in, true)
if m == nil {
return
@ -94,26 +93,15 @@ func (s *server) ResponderTCP(c *net.TCPConn, in []byte) {
println("Failed to pack")
return
}
responder.SendTCP(out, c)
dns.SendTCP(out, c, a)
}
func main() {
runtime.GOMAXPROCS(10) // Be bold
s := new(responder.Server)
s.Address = "127.0.0.1"
s.Port = "8053"
var srv *server
ch := make(chan os.Error)
go s.NewResponder(srv, ch)
t := new(responder.Server)
t.Address = "127.0.0.1"
t.Port = "8053"
t.Tcp = true
var srvt *server
cht := make(chan os.Error)
go t.NewResponder(srvt, cht)
ch := make(chan bool)
dns.ListenAndServe("127.0.0.1:8053", srv, ch)
forever:
for {
@ -121,11 +109,9 @@ forever:
select {
case <-signal.Incoming:
println("Signal received, stopping")
ch <- nil
cht <- nil
ch <- true
break forever
}
}
close(cht)
close(ch)
}

View File

@ -1,6 +0,0 @@
#!/bin/sh
# small wrapper to ease installation
make
make -C resolver install
make -C responder install
make _examples

View File

@ -27,6 +27,8 @@ import (
"net"
)
type Server int // Doesn't really matter
// Wrap request in this struct
type Request struct {
Tcp bool // True for tcp, false for udp
@ -174,7 +176,7 @@ func ListenAndServe(addr string, handler Handler, q chan bool) os.Error {
}
// Send a buffer on the TCP connection.
func SendTCP(m []byte, c *net.TCPConn) os.Error {
func SendTCP(m []byte, c *net.TCPConn, a net.Addr) os.Error {
l := make([]byte, 2)
l[0] = byte(len(m) >> 8)
l[1] = byte(len(m))

View File

@ -44,21 +44,22 @@ func (h *server) ReplyUDP(c *net.UDPConn, a net.Addr, in []byte) {
SendUDP(out, c, a)
}
func (h *server) ReplyTCP(c *net.TCPConn, in []byte) {
func (h *server) ReplyTCP(c *net.TCPConn, a net.Addr, in []byte) {
inmsg := new(Msg)
inmsg.Unpack(in)
if inmsg.MsgHdr.Response == true {
return
}
out := createpkg(inmsg.MsgHdr.Id, true, c.RemoteAddr())
SendTCP(out, c)
out := createpkg(inmsg.MsgHdr.Id, true, a)
SendTCP(out, c, a)
}
func TestResponder(t *testing.T) {
var h *server
go ListenAndServeTCP("127.0.0.1:8053", h)
go ListenAndServeUDP("127.0.0.1:8053", h)
time.Sleep(1 * 1e9)
quit := make(chan bool)
go ListenAndServe("127.0.0.1:8053", h, quit)
time.Sleep(2 * 1e9)
quit <- true
}
/*