| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 | package tcpimport (	"context"	gotls "crypto/tls"	"v2ray.com/core/common"	"v2ray.com/core/common/net"	"v2ray.com/core/common/retry"	"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.AddConnection}// ListenTCP creates a new Listener based on configurations.func ListenTCP(ctx context.Context, address net.Address, port net.Port, addConn internet.AddConnection) (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).WriteToLog()	networkSettings := internet.TransportSettingsFromContext(ctx)	tcpSettings := networkSettings.(*Config)	l := &Listener{		listener: listener,		config:   tcpSettings,		addConn:  addConn,	}	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(ctx)	return l, nil}func (v *Listener) keepAccepting(ctx context.Context) {	for {		select {		case <-ctx.Done():			return		default:		}		var conn net.Conn		err := retry.ExponentialBackoff(5, 200).On(func() error {			rawConn, err := v.listener.Accept()			if err != nil {				return err			}			conn = rawConn			return nil		})		if err != nil {			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(context.Background(), 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))}
 |