diff --git a/net/lux_channel.go b/net/lux_channel.go index f4d20ff..788e9bd 100644 --- a/net/lux_channel.go +++ b/net/lux_channel.go @@ -25,6 +25,7 @@ type LuxChannel struct { Address *net.UDPAddr conn *net.UDPConn preconnected bool + control chan bool } // bind udp socket to receive packets @@ -44,6 +45,7 @@ func NewLuxInboundChannel(udpStr string, chType LuxChannelType) (LuxChannel, err Address: addr, conn: conn, preconnected: false, + control: make(chan bool), }, nil } diff --git a/net/lux_router.go b/net/lux_router.go index 1624192..032abe5 100644 --- a/net/lux_router.go +++ b/net/lux_router.go @@ -190,6 +190,7 @@ func (r *LuxRouter) CloseChannel(channel *LuxChannel, closeInbound bool) { if closeInbound { for i, ch := range r.inbound { if &ch == channel { + ch.control <- true r.inbound = append(r.inbound[:i], r.inbound[:i+1]...) } } @@ -208,12 +209,17 @@ func channelReceiver(r *LuxRouter, channel *LuxChannel) { var dgram LuxDatagram var err error - for err == nil { + select { + case <-channel.control: + return + default: dgram, err = channel.Recv() - dgramChan <- dgram + if err == nil { + dgramChan <- dgram + } else { + return + } } - - r.CloseChannel(channel, true) } func (r *LuxRouter) Start() {