default_tcp.go 2.4 KB

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