A better model
But now the routine seem to hang after 1 try
This commit is contained in:
parent
241d441371
commit
63c18cdb2e
|
@ -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)
|
||||
}
|
||||
|
|
6
install
6
install
|
@ -1,6 +0,0 @@
|
|||
#!/bin/sh
|
||||
# small wrapper to ease installation
|
||||
make
|
||||
make -C resolver install
|
||||
make -C responder install
|
||||
make _examples
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue