|
|
|
@ -15,7 +15,8 @@ type serverUdpListener struct {
@@ -15,7 +15,8 @@ type serverUdpListener struct {
|
|
|
|
|
p *program |
|
|
|
|
nconn *net.UDPConn |
|
|
|
|
flow trackFlow |
|
|
|
|
chanWrite chan *udpWrite |
|
|
|
|
write chan *udpWrite |
|
|
|
|
done chan struct{} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func newServerUdpListener(p *program, port int, flow trackFlow) (*serverUdpListener, error) { |
|
|
|
@ -30,7 +31,8 @@ func newServerUdpListener(p *program, port int, flow trackFlow) (*serverUdpListe
@@ -30,7 +31,8 @@ func newServerUdpListener(p *program, port int, flow trackFlow) (*serverUdpListe
|
|
|
|
|
p: p, |
|
|
|
|
nconn: nconn, |
|
|
|
|
flow: flow, |
|
|
|
|
chanWrite: make(chan *udpWrite), |
|
|
|
|
write: make(chan *udpWrite), |
|
|
|
|
done: make(chan struct{}), |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
l.log("opened on :%d", port) |
|
|
|
@ -49,6 +51,12 @@ func (l *serverUdpListener) log(format string, args ...interface{}) {
@@ -49,6 +51,12 @@ func (l *serverUdpListener) log(format string, args ...interface{}) {
|
|
|
|
|
|
|
|
|
|
func (l *serverUdpListener) run() { |
|
|
|
|
go func() { |
|
|
|
|
for w := range l.write { |
|
|
|
|
l.nconn.SetWriteDeadline(time.Now().Add(_WRITE_TIMEOUT)) |
|
|
|
|
l.nconn.WriteTo(w.buf, w.addr) |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
for { |
|
|
|
|
// create a buffer for each read.
|
|
|
|
|
// this is necessary since the buffer is propagated with channels
|
|
|
|
@ -56,7 +64,6 @@ func (l *serverUdpListener) run() {
@@ -56,7 +64,6 @@ func (l *serverUdpListener) run() {
|
|
|
|
|
buf := make([]byte, 2048) // UDP MTU is 1400
|
|
|
|
|
n, addr, err := l.nconn.ReadFromUDP(buf) |
|
|
|
|
if err != nil { |
|
|
|
|
l.log("ERR: %s", err) |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -92,13 +99,13 @@ func (l *serverUdpListener) run() {
@@ -92,13 +99,13 @@ func (l *serverUdpListener) run() {
|
|
|
|
|
l.p.forwardTrack(path, trackId, l.flow, buf[:n]) |
|
|
|
|
}() |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
go func() { |
|
|
|
|
for { |
|
|
|
|
w := <-l.chanWrite |
|
|
|
|
l.nconn.SetWriteDeadline(time.Now().Add(_WRITE_TIMEOUT)) |
|
|
|
|
l.nconn.WriteTo(w.buf, w.addr) |
|
|
|
|
close(l.write) |
|
|
|
|
|
|
|
|
|
l.done <- struct{}{} |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
func (l *serverUdpListener) close() { |
|
|
|
|
l.nconn.Close() |
|
|
|
|
<-l.done |
|
|
|
|
} |
|
|
|
|