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 }