| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | package tcpimport (	"context"	gotls "crypto/tls"	"strings"	"v2ray.com/core/common"	"v2ray.com/core/common/net"	"v2ray.com/core/common/session"	"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).WriteToLog(session.ExportIDToError(ctx))	tcpSettings := getTCPSettingsFromContext(ctx)	l := &Listener{		listener: listener,		config:   tcpSettings,		addConn:  handler,	}	if config := tls.ConfigFromContext(ctx); config != nil {		l.tlsConfig = config.GetTLSConfig(tls.WithNextProto("h2"))	}	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(protocolName, ListenTCP))}
 |