| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | package tcpimport (	"context"	gotls "crypto/tls"	"strings"	"v2ray.com/core/common"	"v2ray.com/core/common/net"	"v2ray.com/core/transport/internet"	"v2ray.com/core/transport/internet/tls")// Listener is an internet.Listener that listens for TCP connections.type Listener struct {	listener   *net.TCPListener	tlsConfig  *gotls.Config	authConfig internet.ConnectionAuthenticator	config     *Config	addConn    internet.ConnHandler}// ListenTCP creates a new Listener based on configurations.func ListenTCP(ctx context.Context, address net.Address, port net.Port, handler internet.ConnHandler) (internet.Listener, error) {	listener, err := net.ListenTCP("tcp", &net.TCPAddr{		IP:   address.IP(),		Port: int(port),	})	if err != nil {		return nil, err	}	newError("listening TCP on ", address, ":", port).WithContext(ctx).WriteToLog()	networkSettings := internet.TransportSettingsFromContext(ctx)	tcpSettings := networkSettings.(*Config)	l := &Listener{		listener: listener,		config:   tcpSettings,		addConn:  handler,	}	if config := tls.ConfigFromContext(ctx, tls.WithNextProto("h2")); config != nil {		l.tlsConfig = config.GetTLSConfig()	}	if tcpSettings.HeaderSettings != nil {		headerConfig, err := tcpSettings.HeaderSettings.GetInstance()		if err != nil {			return nil, newError("invalid header settings").Base(err).AtError()		}		auth, err := internet.CreateConnectionAuthenticator(headerConfig)		if err != nil {			return nil, newError("invalid header settings.").Base(err).AtError()		}		l.authConfig = auth	}	go l.keepAccepting()	return l, nil}func (v *Listener) keepAccepting() {	for {		conn, err := v.listener.Accept()		if err != nil {			if strings.Contains(err.Error(), "closed") {				break			}			newError("failed to accepted raw connections").Base(err).AtWarning().WriteToLog()			continue		}		if v.tlsConfig != nil {			conn = tls.Server(conn, v.tlsConfig)		}		if v.authConfig != nil {			conn = v.authConfig.Server(conn)		}		v.addConn(internet.Connection(conn))	}}// Addr implements internet.Listener.Addr.func (v *Listener) Addr() net.Addr {	return v.listener.Addr()}// Close implements internet.Listener.Close.func (v *Listener) Close() error {	return v.listener.Close()}func init() {	common.Must(internet.RegisterTransportListener(internet.TransportProtocol_TCP, ListenTCP))}
 |