hub.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package tcp
  2. import (
  3. "context"
  4. gotls "crypto/tls"
  5. "net"
  6. "time"
  7. "v2ray.com/core/app/log"
  8. "v2ray.com/core/common"
  9. v2net "v2ray.com/core/common/net"
  10. "v2ray.com/core/common/retry"
  11. "v2ray.com/core/transport/internet"
  12. "v2ray.com/core/transport/internet/tls"
  13. )
  14. type TCPListener struct {
  15. ctx context.Context
  16. listener *net.TCPListener
  17. tlsConfig *gotls.Config
  18. authConfig internet.ConnectionAuthenticator
  19. config *Config
  20. conns chan<- internet.Connection
  21. }
  22. func ListenTCP(ctx context.Context, address v2net.Address, port v2net.Port, conns chan<- internet.Connection) (internet.Listener, error) {
  23. listener, err := net.ListenTCP("tcp", &net.TCPAddr{
  24. IP: address.IP(),
  25. Port: int(port),
  26. })
  27. if err != nil {
  28. return nil, err
  29. }
  30. log.Trace(newError("listening TCP on ", address, ":", port))
  31. networkSettings := internet.TransportSettingsFromContext(ctx)
  32. tcpSettings := networkSettings.(*Config)
  33. l := &TCPListener{
  34. ctx: ctx,
  35. listener: listener,
  36. config: tcpSettings,
  37. conns: conns,
  38. }
  39. if securitySettings := internet.SecuritySettingsFromContext(ctx); securitySettings != nil {
  40. tlsConfig, ok := securitySettings.(*tls.Config)
  41. if ok {
  42. l.tlsConfig = tlsConfig.GetTLSConfig()
  43. }
  44. }
  45. if tcpSettings.HeaderSettings != nil {
  46. headerConfig, err := tcpSettings.HeaderSettings.GetInstance()
  47. if err != nil {
  48. return nil, newError("invalid header settings").Base(err).AtError()
  49. }
  50. auth, err := internet.CreateConnectionAuthenticator(headerConfig)
  51. if err != nil {
  52. return nil, newError("invalid header settings.").Base(err).AtError()
  53. }
  54. l.authConfig = auth
  55. }
  56. go l.KeepAccepting()
  57. return l, nil
  58. }
  59. func (v *TCPListener) KeepAccepting() {
  60. for {
  61. select {
  62. case <-v.ctx.Done():
  63. return
  64. default:
  65. }
  66. var conn net.Conn
  67. err := retry.ExponentialBackoff(5, 200).On(func() error {
  68. rawConn, err := v.listener.Accept()
  69. if err != nil {
  70. return err
  71. }
  72. conn = rawConn
  73. return nil
  74. })
  75. if err != nil {
  76. log.Trace(newError("failed to accepted raw connections").Base(err).AtWarning())
  77. continue
  78. }
  79. if v.tlsConfig != nil {
  80. conn = tls.Server(conn, v.tlsConfig)
  81. }
  82. if v.authConfig != nil {
  83. conn = v.authConfig.Server(conn)
  84. }
  85. select {
  86. case v.conns <- internet.Connection(conn):
  87. case <-time.After(time.Second * 5):
  88. conn.Close()
  89. }
  90. }
  91. }
  92. func (v *TCPListener) Addr() net.Addr {
  93. return v.listener.Addr()
  94. }
  95. func (v *TCPListener) Close() error {
  96. return v.listener.Close()
  97. }
  98. func init() {
  99. common.Must(internet.RegisterTransportListener(internet.TransportProtocol_TCP, ListenTCP))
  100. }