|  | @@ -80,18 +80,18 @@ func (o *ServerConnection) Id() internal.ConnectionID {
 | 
	
		
			
				|  |  |  // Listener defines a server listening for connections
 | 
	
		
			
				|  |  |  type Listener struct {
 | 
	
		
			
				|  |  |  	sync.Mutex
 | 
	
		
			
				|  |  | -	closed        chan bool
 | 
	
		
			
				|  |  | -	sessions      map[ConnectionID]*Connection
 | 
	
		
			
				|  |  | -	awaitingConns chan *Connection
 | 
	
		
			
				|  |  | -	hub           *udp.Hub
 | 
	
		
			
				|  |  | -	tlsConfig     *tls.Config
 | 
	
		
			
				|  |  | -	config        *Config
 | 
	
		
			
				|  |  | -	reader        PacketReader
 | 
	
		
			
				|  |  | -	header        internet.PacketHeader
 | 
	
		
			
				|  |  | -	security      cipher.AEAD
 | 
	
		
			
				|  |  | +	closed    chan bool
 | 
	
		
			
				|  |  | +	sessions  map[ConnectionID]*Connection
 | 
	
		
			
				|  |  | +	hub       *udp.Hub
 | 
	
		
			
				|  |  | +	tlsConfig *tls.Config
 | 
	
		
			
				|  |  | +	config    *Config
 | 
	
		
			
				|  |  | +	reader    PacketReader
 | 
	
		
			
				|  |  | +	header    internet.PacketHeader
 | 
	
		
			
				|  |  | +	security  cipher.AEAD
 | 
	
		
			
				|  |  | +	conns     chan<- internet.Connection
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func NewListener(ctx context.Context, address v2net.Address, port v2net.Port) (*Listener, error) {
 | 
	
		
			
				|  |  | +func NewListener(ctx context.Context, address v2net.Address, port v2net.Port, conns chan<- internet.Connection) (*Listener, error) {
 | 
	
		
			
				|  |  |  	networkSettings := internet.TransportSettingsFromContext(ctx)
 | 
	
		
			
				|  |  |  	kcpSettings := networkSettings.(*Config)
 | 
	
		
			
				|  |  |  	kcpSettings.ConnectionReuse = &ConnectionReuse{Enable: false}
 | 
	
	
		
			
				|  | @@ -111,10 +111,10 @@ func NewListener(ctx context.Context, address v2net.Address, port v2net.Port) (*
 | 
	
		
			
				|  |  |  			Header:   header,
 | 
	
		
			
				|  |  |  			Security: security,
 | 
	
		
			
				|  |  |  		},
 | 
	
		
			
				|  |  | -		sessions:      make(map[ConnectionID]*Connection),
 | 
	
		
			
				|  |  | -		awaitingConns: make(chan *Connection, 64),
 | 
	
		
			
				|  |  | -		closed:        make(chan bool),
 | 
	
		
			
				|  |  | -		config:        kcpSettings,
 | 
	
		
			
				|  |  | +		sessions: make(map[ConnectionID]*Connection),
 | 
	
		
			
				|  |  | +		closed:   make(chan bool),
 | 
	
		
			
				|  |  | +		config:   kcpSettings,
 | 
	
		
			
				|  |  | +		conns:    conns,
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	securitySettings := internet.SecuritySettingsFromContext(ctx)
 | 
	
		
			
				|  |  |  	if securitySettings != nil {
 | 
	
	
		
			
				|  | @@ -194,8 +194,14 @@ func (v *Listener) OnReceive(payload *buf.Buffer, src v2net.Destination, origina
 | 
	
		
			
				|  |  |  			closer: writer,
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  		conn = NewConnection(conv, sConn, v, v.config)
 | 
	
		
			
				|  |  | +		var netConn internet.Connection = conn
 | 
	
		
			
				|  |  | +		if v.tlsConfig != nil {
 | 
	
		
			
				|  |  | +			tlsConn := tls.Server(conn, v.tlsConfig)
 | 
	
		
			
				|  |  | +			netConn = UnreusableConnection{Conn: tlsConn}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  		select {
 | 
	
		
			
				|  |  | -		case v.awaitingConns <- conn:
 | 
	
		
			
				|  |  | +		case v.conns <- netConn:
 | 
	
		
			
				|  |  |  		case <-time.After(time.Second * 5):
 | 
	
		
			
				|  |  |  			conn.Close()
 | 
	
		
			
				|  |  |  			return
 | 
	
	
		
			
				|  | @@ -216,27 +222,6 @@ func (v *Listener) Remove(id ConnectionID) {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// Accept implements the Accept method in the Listener interface; it waits for the next call and returns a generic Conn.
 | 
	
		
			
				|  |  | -func (v *Listener) Accept() (internet.Connection, error) {
 | 
	
		
			
				|  |  | -	for {
 | 
	
		
			
				|  |  | -		select {
 | 
	
		
			
				|  |  | -		case <-v.closed:
 | 
	
		
			
				|  |  | -			return nil, ErrClosedListener
 | 
	
		
			
				|  |  | -		case conn, open := <-v.awaitingConns:
 | 
	
		
			
				|  |  | -			if !open {
 | 
	
		
			
				|  |  | -				break
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			if v.tlsConfig != nil {
 | 
	
		
			
				|  |  | -				tlsConn := tls.Server(conn, v.tlsConfig)
 | 
	
		
			
				|  |  | -				return UnreusableConnection{Conn: tlsConn}, nil
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			return conn, nil
 | 
	
		
			
				|  |  | -		case <-time.After(time.Second):
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  // Close stops listening on the UDP address. Already Accepted connections are not closed.
 | 
	
		
			
				|  |  |  func (v *Listener) Close() error {
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -249,7 +234,6 @@ func (v *Listener) Close() error {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	close(v.closed)
 | 
	
		
			
				|  |  | -	close(v.awaitingConns)
 | 
	
		
			
				|  |  |  	for _, conn := range v.sessions {
 | 
	
		
			
				|  |  |  		go conn.Terminate()
 | 
	
		
			
				|  |  |  	}
 | 
	
	
		
			
				|  | @@ -288,8 +272,8 @@ func (v *Writer) Close() error {
 | 
	
		
			
				|  |  |  	return nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func ListenKCP(ctx context.Context, address v2net.Address, port v2net.Port) (internet.Listener, error) {
 | 
	
		
			
				|  |  | -	return NewListener(ctx, address, port)
 | 
	
		
			
				|  |  | +func ListenKCP(ctx context.Context, address v2net.Address, port v2net.Port, conns chan<- internet.Connection) (internet.Listener, error) {
 | 
	
		
			
				|  |  | +	return NewListener(ctx, address, port, conns)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func init() {
 |