always.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package inbound
  2. import (
  3. "context"
  4. "v2ray.com/core/app/proxyman"
  5. "v2ray.com/core/common/dice"
  6. "v2ray.com/core/common/log"
  7. "v2ray.com/core/common/net"
  8. "v2ray.com/core/proxy"
  9. )
  10. type AlwaysOnInboundHandler struct {
  11. proxy proxy.InboundHandler
  12. workers []worker
  13. }
  14. func NewAlwaysOnInboundHandler(ctx context.Context, tag string, receiverConfig *proxyman.ReceiverConfig, proxyConfig interface{}) (*AlwaysOnInboundHandler, error) {
  15. p, err := proxy.CreateInboundHandler(ctx, proxyConfig)
  16. if err != nil {
  17. return nil, err
  18. }
  19. h := &AlwaysOnInboundHandler{
  20. proxy: p,
  21. }
  22. nl := p.Network()
  23. pr := receiverConfig.PortRange
  24. for port := pr.From; port <= pr.To; port++ {
  25. if nl.HasNetwork(net.Network_TCP) {
  26. log.Debug("Proxyman|DefaultInboundHandler: creating tcp worker on ", receiverConfig.Listen.AsAddress(), ":", port)
  27. worker := &tcpWorker{
  28. address: receiverConfig.Listen.AsAddress(),
  29. port: net.Port(port),
  30. proxy: p,
  31. stream: receiverConfig.StreamSettings,
  32. recvOrigDest: receiverConfig.ReceiveOriginalDestination,
  33. tag: tag,
  34. allowPassiveConn: receiverConfig.AllowPassiveConnection,
  35. }
  36. h.workers = append(h.workers, worker)
  37. }
  38. if nl.HasNetwork(net.Network_UDP) {
  39. worker := &udpWorker{
  40. tag: tag,
  41. proxy: p,
  42. address: receiverConfig.Listen.AsAddress(),
  43. port: net.Port(port),
  44. recvOrigDest: receiverConfig.ReceiveOriginalDestination,
  45. }
  46. h.workers = append(h.workers, worker)
  47. }
  48. }
  49. return h, nil
  50. }
  51. func (h *AlwaysOnInboundHandler) Start() error {
  52. for _, worker := range h.workers {
  53. if err := worker.Start(); err != nil {
  54. return err
  55. }
  56. }
  57. return nil
  58. }
  59. func (h *AlwaysOnInboundHandler) Close() {
  60. for _, worker := range h.workers {
  61. worker.Close()
  62. }
  63. }
  64. func (h *AlwaysOnInboundHandler) GetRandomInboundProxy() (proxy.InboundHandler, net.Port, int) {
  65. w := h.workers[dice.Roll(len(h.workers))]
  66. return w.Proxy(), w.Port(), 9999
  67. }