github.com/sagernet/sing-box@v1.2.7/inbound/default_tcp.go (about)

     1  package inbound
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  
     7  	"github.com/sagernet/sing-box/adapter"
     8  	"github.com/sagernet/sing-box/common/proxyproto"
     9  	"github.com/sagernet/sing-box/log"
    10  	E "github.com/sagernet/sing/common/exceptions"
    11  	M "github.com/sagernet/sing/common/metadata"
    12  	N "github.com/sagernet/sing/common/network"
    13  	"github.com/sagernet/tfo-go"
    14  )
    15  
    16  func (a *myInboundAdapter) ListenTCP() (net.Listener, error) {
    17  	var err error
    18  	bindAddr := M.SocksaddrFrom(a.listenOptions.Listen.Build(), a.listenOptions.ListenPort)
    19  	var tcpListener net.Listener
    20  	if !a.listenOptions.TCPFastOpen {
    21  		tcpListener, err = net.ListenTCP(M.NetworkFromNetAddr(N.NetworkTCP, bindAddr.Addr), bindAddr.TCPAddr())
    22  	} else {
    23  		tcpListener, err = tfo.ListenTCP(M.NetworkFromNetAddr(N.NetworkTCP, bindAddr.Addr), bindAddr.TCPAddr())
    24  	}
    25  	if err == nil {
    26  		a.logger.Info("tcp server started at ", tcpListener.Addr())
    27  	}
    28  	if a.listenOptions.ProxyProtocol {
    29  		a.logger.Debug("proxy protocol enabled")
    30  		tcpListener = &proxyproto.Listener{Listener: tcpListener, AcceptNoHeader: a.listenOptions.ProxyProtocolAcceptNoHeader}
    31  	}
    32  	a.tcpListener = tcpListener
    33  	return tcpListener, err
    34  }
    35  
    36  func (a *myInboundAdapter) loopTCPIn() {
    37  	tcpListener := a.tcpListener
    38  	for {
    39  		conn, err := tcpListener.Accept()
    40  		if err != nil {
    41  			//goland:noinspection GoDeprecation
    42  			//nolint:staticcheck
    43  			if netError, isNetError := err.(net.Error); isNetError && netError.Temporary() {
    44  				a.logger.Error(err)
    45  				continue
    46  			}
    47  			if a.inShutdown.Load() && E.IsClosed(err) {
    48  				return
    49  			}
    50  			a.tcpListener.Close()
    51  			a.logger.Error("serve error: ", err)
    52  			continue
    53  		}
    54  		go a.injectTCP(conn, adapter.InboundContext{})
    55  	}
    56  }
    57  
    58  func (a *myInboundAdapter) injectTCP(conn net.Conn, metadata adapter.InboundContext) {
    59  	ctx := log.ContextWithNewID(a.ctx)
    60  	metadata = a.createMetadata(conn, metadata)
    61  	a.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
    62  	hErr := a.connHandler.NewConnection(ctx, conn, metadata)
    63  	if hErr != nil {
    64  		conn.Close()
    65  		a.NewError(ctx, E.Cause(hErr, "process connection from ", metadata.Source))
    66  	}
    67  }
    68  
    69  func (a *myInboundAdapter) routeTCP(ctx context.Context, conn net.Conn, metadata adapter.InboundContext) {
    70  	a.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
    71  	hErr := a.newConnection(ctx, conn, metadata)
    72  	if hErr != nil {
    73  		conn.Close()
    74  		a.NewError(ctx, E.Cause(hErr, "process connection from ", metadata.Source))
    75  	}
    76  }