|
|
|
@ -13,7 +13,8 @@ import (
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type DokodemoDoor struct {
|
|
|
|
|
sync.Mutex
|
|
|
|
|
tcpMutex sync.RWMutex
|
|
|
|
|
udpMutex sync.RWMutex
|
|
|
|
|
config Config
|
|
|
|
|
accepting bool
|
|
|
|
|
address v2net.Address
|
|
|
|
@ -35,16 +36,16 @@ func NewDokodemoDoor(space app.Space, config Config) *DokodemoDoor {
|
|
|
|
|
func (this *DokodemoDoor) Close() {
|
|
|
|
|
this.accepting = false
|
|
|
|
|
if this.tcpListener != nil {
|
|
|
|
|
this.Lock()
|
|
|
|
|
this.tcpListener.Close()
|
|
|
|
|
this.tcpMutex.Lock()
|
|
|
|
|
this.tcpListener = nil
|
|
|
|
|
this.Unlock()
|
|
|
|
|
this.tcpMutex.Unlock()
|
|
|
|
|
}
|
|
|
|
|
if this.udpConn != nil {
|
|
|
|
|
this.Lock()
|
|
|
|
|
this.udpConn.Close()
|
|
|
|
|
this.udpMutex.Lock()
|
|
|
|
|
this.udpConn = nil
|
|
|
|
|
this.Unlock()
|
|
|
|
|
this.udpMutex.Unlock()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -84,13 +85,12 @@ func (this *DokodemoDoor) ListenUDP(port v2net.Port) error {
|
|
|
|
|
func (this *DokodemoDoor) handleUDPPackets() {
|
|
|
|
|
for this.accepting {
|
|
|
|
|
buffer := alloc.NewBuffer()
|
|
|
|
|
var udpConn *net.UDPConn
|
|
|
|
|
this.Lock()
|
|
|
|
|
if this.udpConn != nil {
|
|
|
|
|
udpConn = this.udpConn
|
|
|
|
|
this.udpMutex.RLock()
|
|
|
|
|
if !this.accepting {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
this.Unlock()
|
|
|
|
|
nBytes, addr, err := udpConn.ReadFromUDP(buffer.Value)
|
|
|
|
|
nBytes, addr, err := this.udpConn.ReadFromUDP(buffer.Value)
|
|
|
|
|
this.udpMutex.RUnlock()
|
|
|
|
|
buffer.Slice(0, nBytes)
|
|
|
|
|
if err != nil {
|
|
|
|
|
buffer.Release()
|
|
|
|
@ -103,7 +103,13 @@ func (this *DokodemoDoor) handleUDPPackets() {
|
|
|
|
|
close(ray.InboundInput())
|
|
|
|
|
|
|
|
|
|
for payload := range ray.InboundOutput() {
|
|
|
|
|
udpConn.WriteToUDP(payload.Value, addr)
|
|
|
|
|
this.udpMutex.RLock()
|
|
|
|
|
if !this.accepting {
|
|
|
|
|
this.udpMutex.RUnlock()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
this.udpConn.WriteToUDP(payload.Value, addr)
|
|
|
|
|
this.udpMutex.RUnlock()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -126,8 +132,11 @@ func (this *DokodemoDoor) ListenTCP(port v2net.Port) error {
|
|
|
|
|
func (this *DokodemoDoor) AcceptTCPConnections() {
|
|
|
|
|
for this.accepting {
|
|
|
|
|
retry.Timed(100, 100).On(func() error {
|
|
|
|
|
this.Lock()
|
|
|
|
|
defer this.Unlock()
|
|
|
|
|
if !this.accepting {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
this.tcpMutex.RLock()
|
|
|
|
|
defer this.tcpMutex.RUnlock()
|
|
|
|
|
if this.tcpListener != nil {
|
|
|
|
|
connection, err := this.tcpListener.AcceptTCP()
|
|
|
|
|
if err != nil {
|
|
|
|
|