hub.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package tcp
  2. import (
  3. "crypto/tls"
  4. "errors"
  5. "net"
  6. "sync"
  7. "time"
  8. "v2ray.com/core/common/log"
  9. v2net "v2ray.com/core/common/net"
  10. "v2ray.com/core/transport/internet"
  11. v2tls "v2ray.com/core/transport/internet/tls"
  12. )
  13. var (
  14. ErrClosedListener = errors.New("Listener is closed.")
  15. )
  16. type ConnectionWithError struct {
  17. conn net.Conn
  18. err error
  19. }
  20. type TCPListener struct {
  21. sync.Mutex
  22. acccepting bool
  23. listener *net.TCPListener
  24. awaitingConns chan *ConnectionWithError
  25. tlsConfig *tls.Config
  26. config *Config
  27. }
  28. func ListenTCP(address v2net.Address, port v2net.Port, options internet.ListenOptions) (internet.Listener, error) {
  29. listener, err := net.ListenTCP("tcp", &net.TCPAddr{
  30. IP: address.IP(),
  31. Port: int(port),
  32. })
  33. if err != nil {
  34. return nil, err
  35. }
  36. networkSettings, err := options.Stream.GetEffectiveNetworkSettings()
  37. if err != nil {
  38. return nil, err
  39. }
  40. tcpSettings := networkSettings.(*Config)
  41. l := &TCPListener{
  42. acccepting: true,
  43. listener: listener,
  44. awaitingConns: make(chan *ConnectionWithError, 32),
  45. config: tcpSettings,
  46. }
  47. if options.Stream != nil && options.Stream.SecurityType == internet.SecurityType_TLS {
  48. securitySettings, err := options.Stream.GetEffectiveSecuritySettings()
  49. if err != nil {
  50. log.Error("TCP: Failed to apply TLS config: ", err)
  51. return nil, err
  52. }
  53. l.tlsConfig = securitySettings.(*v2tls.Config).GetTLSConfig()
  54. }
  55. go l.KeepAccepting()
  56. return l, nil
  57. }
  58. func (this *TCPListener) Accept() (internet.Connection, error) {
  59. for this.acccepting {
  60. select {
  61. case connErr, open := <-this.awaitingConns:
  62. if !open {
  63. return nil, ErrClosedListener
  64. }
  65. if connErr.err != nil {
  66. return nil, connErr.err
  67. }
  68. conn := connErr.conn
  69. if this.tlsConfig != nil {
  70. conn = tls.Server(conn, this.tlsConfig)
  71. }
  72. return NewConnection("", conn, this, this.config), nil
  73. case <-time.After(time.Second * 2):
  74. }
  75. }
  76. return nil, ErrClosedListener
  77. }
  78. func (this *TCPListener) KeepAccepting() {
  79. for this.acccepting {
  80. conn, err := this.listener.Accept()
  81. this.Lock()
  82. if !this.acccepting {
  83. this.Unlock()
  84. break
  85. }
  86. select {
  87. case this.awaitingConns <- &ConnectionWithError{
  88. conn: conn,
  89. err: err,
  90. }:
  91. default:
  92. if conn != nil {
  93. conn.Close()
  94. }
  95. }
  96. this.Unlock()
  97. }
  98. }
  99. func (this *TCPListener) Recycle(dest string, conn net.Conn) {
  100. this.Lock()
  101. defer this.Unlock()
  102. if !this.acccepting {
  103. return
  104. }
  105. select {
  106. case this.awaitingConns <- &ConnectionWithError{conn: conn}:
  107. default:
  108. conn.Close()
  109. }
  110. }
  111. func (this *TCPListener) Addr() net.Addr {
  112. return this.listener.Addr()
  113. }
  114. func (this *TCPListener) Close() error {
  115. this.Lock()
  116. defer this.Unlock()
  117. this.acccepting = false
  118. this.listener.Close()
  119. close(this.awaitingConns)
  120. for connErr := range this.awaitingConns {
  121. if connErr.conn != nil {
  122. go connErr.conn.Close()
  123. }
  124. }
  125. return nil
  126. }
  127. type RawTCPListener struct {
  128. accepting bool
  129. listener *net.TCPListener
  130. }
  131. func (this *RawTCPListener) Accept() (internet.Connection, error) {
  132. conn, err := this.listener.AcceptTCP()
  133. if err != nil {
  134. return nil, err
  135. }
  136. return &RawConnection{
  137. TCPConn: *conn,
  138. }, nil
  139. }
  140. func (this *RawTCPListener) Addr() net.Addr {
  141. return this.listener.Addr()
  142. }
  143. func (this *RawTCPListener) Close() error {
  144. this.accepting = false
  145. this.listener.Close()
  146. return nil
  147. }
  148. func ListenRawTCP(address v2net.Address, port v2net.Port, options internet.ListenOptions) (internet.Listener, error) {
  149. listener, err := net.ListenTCP("tcp", &net.TCPAddr{
  150. IP: address.IP(),
  151. Port: int(port),
  152. })
  153. if err != nil {
  154. return nil, err
  155. }
  156. // TODO: handle listen options
  157. return &RawTCPListener{
  158. accepting: true,
  159. listener: listener,
  160. }, nil
  161. }
  162. func init() {
  163. internet.TCPListenFunc = ListenTCP
  164. internet.RawTCPListenFunc = ListenRawTCP
  165. }