hub.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // +build !confonly
  2. package tcp
  3. import (
  4. "context"
  5. gotls "crypto/tls"
  6. "strings"
  7. "v2ray.com/core/common"
  8. "v2ray.com/core/common/net"
  9. "v2ray.com/core/common/session"
  10. "v2ray.com/core/transport/internet"
  11. "v2ray.com/core/transport/internet/tls"
  12. )
  13. // Listener is an internet.Listener that listens for TCP connections.
  14. type Listener struct {
  15. listener net.Listener
  16. tlsConfig *gotls.Config
  17. authConfig internet.ConnectionAuthenticator
  18. config *Config
  19. addConn internet.ConnHandler
  20. }
  21. // ListenTCP creates a new Listener based on configurations.
  22. func ListenTCP(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, handler internet.ConnHandler) (internet.Listener, error) {
  23. listener, err := internet.ListenSystem(ctx, &net.TCPAddr{
  24. IP: address.IP(),
  25. Port: int(port),
  26. }, streamSettings.SocketSettings)
  27. if err != nil {
  28. return nil, err
  29. }
  30. newError("listening TCP on ", address, ":", port).WriteToLog(session.ExportIDToError(ctx))
  31. tcpSettings := streamSettings.ProtocolSettings.(*Config)
  32. l := &Listener{
  33. listener: listener,
  34. config: tcpSettings,
  35. addConn: handler,
  36. }
  37. if config := tls.ConfigFromStreamSettings(streamSettings); config != nil {
  38. l.tlsConfig = config.GetTLSConfig(tls.WithNextProto("h2"))
  39. }
  40. if tcpSettings.HeaderSettings != nil {
  41. headerConfig, err := tcpSettings.HeaderSettings.GetInstance()
  42. if err != nil {
  43. return nil, newError("invalid header settings").Base(err).AtError()
  44. }
  45. auth, err := internet.CreateConnectionAuthenticator(headerConfig)
  46. if err != nil {
  47. return nil, newError("invalid header settings.").Base(err).AtError()
  48. }
  49. l.authConfig = auth
  50. }
  51. go l.keepAccepting()
  52. return l, nil
  53. }
  54. func (v *Listener) keepAccepting() {
  55. for {
  56. conn, err := v.listener.Accept()
  57. if err != nil {
  58. if strings.Contains(err.Error(), "closed") {
  59. break
  60. }
  61. newError("failed to accepted raw connections").Base(err).AtWarning().WriteToLog()
  62. continue
  63. }
  64. if v.tlsConfig != nil {
  65. conn = tls.Server(conn, v.tlsConfig)
  66. }
  67. if v.authConfig != nil {
  68. conn = v.authConfig.Server(conn)
  69. }
  70. v.addConn(internet.Connection(conn))
  71. }
  72. }
  73. // Addr implements internet.Listener.Addr.
  74. func (v *Listener) Addr() net.Addr {
  75. return v.listener.Addr()
  76. }
  77. // Close implements internet.Listener.Close.
  78. func (v *Listener) Close() error {
  79. return v.listener.Close()
  80. }
  81. func init() {
  82. common.Must(internet.RegisterTransportListener(protocolName, ListenTCP))
  83. }