hub.go 2.3 KB

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