always.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package inbound
  2. import (
  3. "context"
  4. "v2ray.com/core/app"
  5. "v2ray.com/core/app/dispatcher"
  6. "v2ray.com/core/app/log"
  7. "v2ray.com/core/app/proxyman"
  8. "v2ray.com/core/common/dice"
  9. "v2ray.com/core/common/errors"
  10. "v2ray.com/core/common/net"
  11. "v2ray.com/core/proxy"
  12. "v2ray.com/core/transport/ray"
  13. )
  14. type AlwaysOnInboundHandler struct {
  15. proxy proxy.Inbound
  16. workers []worker
  17. dispatcher dispatcher.Interface
  18. }
  19. func NewAlwaysOnInboundHandler(ctx context.Context, tag string, receiverConfig *proxyman.ReceiverConfig, proxyConfig interface{}) (*AlwaysOnInboundHandler, error) {
  20. p, err := proxy.CreateInboundHandler(ctx, proxyConfig)
  21. if err != nil {
  22. return nil, err
  23. }
  24. h := &AlwaysOnInboundHandler{
  25. proxy: p,
  26. }
  27. space := app.SpaceFromContext(ctx)
  28. space.OnInitialize(func() error {
  29. d := dispatcher.FromSpace(space)
  30. if d == nil {
  31. return errors.New("Proxyman|DefaultInboundHandler: No dispatcher in space.")
  32. }
  33. h.dispatcher = d
  34. return nil
  35. })
  36. nl := p.Network()
  37. pr := receiverConfig.PortRange
  38. address := receiverConfig.Listen.AsAddress()
  39. if address == nil {
  40. address = net.AnyIP
  41. }
  42. for port := pr.From; port <= pr.To; port++ {
  43. if nl.HasNetwork(net.Network_TCP) {
  44. log.Debug("Proxyman|DefaultInboundHandler: creating tcp worker on ", address, ":", port)
  45. worker := &tcpWorker{
  46. address: address,
  47. port: net.Port(port),
  48. proxy: p,
  49. stream: receiverConfig.StreamSettings,
  50. recvOrigDest: receiverConfig.ReceiveOriginalDestination,
  51. tag: tag,
  52. allowPassiveConn: receiverConfig.AllowPassiveConnection,
  53. dispatcher: h,
  54. }
  55. h.workers = append(h.workers, worker)
  56. }
  57. if nl.HasNetwork(net.Network_UDP) {
  58. worker := &udpWorker{
  59. tag: tag,
  60. proxy: p,
  61. address: address,
  62. port: net.Port(port),
  63. recvOrigDest: receiverConfig.ReceiveOriginalDestination,
  64. dispatcher: h,
  65. }
  66. h.workers = append(h.workers, worker)
  67. }
  68. }
  69. return h, nil
  70. }
  71. func (h *AlwaysOnInboundHandler) Start() error {
  72. for _, worker := range h.workers {
  73. if err := worker.Start(); err != nil {
  74. return err
  75. }
  76. }
  77. return nil
  78. }
  79. func (h *AlwaysOnInboundHandler) Close() {
  80. for _, worker := range h.workers {
  81. worker.Close()
  82. }
  83. }
  84. func (h *AlwaysOnInboundHandler) GetRandomInboundProxy() (proxy.Inbound, net.Port, int) {
  85. w := h.workers[dice.Roll(len(h.workers))]
  86. return w.Proxy(), w.Port(), 9999
  87. }
  88. func (h *AlwaysOnInboundHandler) Dispatch(ctx context.Context, dest net.Destination) (ray.InboundRay, error) {
  89. return h.dispatcher.Dispatch(ctx, dest)
  90. }