diff --git a/app/receiver/config.go b/app/receiver/config.go new file mode 100644 index 00000000..95687492 --- /dev/null +++ b/app/receiver/config.go @@ -0,0 +1,15 @@ +package receiver + +func (v *AllocationStrategy) GetConcurrencyValue() uint32 { + if v == nil || v.Concurrency == nil { + return 3 + } + return v.Concurrency.Value +} + +func (v *AllocationStrategy) GetRefreshValue() uint32 { + if v == nil || v.Refresh == nil { + return 5 + } + return v.Refresh.Value +} diff --git a/app/receiver/receiver.go b/app/receiver/receiver.go index 5ecd14a4..a3db71eb 100644 --- a/app/receiver/receiver.go +++ b/app/receiver/receiver.go @@ -3,10 +3,27 @@ package receiver import ( "net" + "time" + + v2net "v2ray.com/core/common/net" "v2ray.com/core/proxy" ) type refresher struct { + strategy *AllocationStrategy + portsInUse []v2net.Port +} + +func (r *refresher) Refresh(s *StreamReceiver) { +} + +func (r *refresher) Interval() time.Duration { + switch r.strategy.Type { + case AllocationStrategy_Random: + return time.Minute * time.Duration(r.strategy.GetRefreshValue()) + default: + return 0 + } } type StreamReceiver struct { @@ -14,8 +31,20 @@ type StreamReceiver struct { proxy *proxy.InboundHandler listeners []net.Listener + refresher refresher } -func (r *StreamReceiver) Start() { +func (s *StreamReceiver) Start() { + s.refresher.Refresh(s) + interval := s.refresher.Interval() + if interval == 0 { + return + } + go func() { + for { + time.Sleep(s.refresher.Interval()) + s.refresher.Refresh(s) + } + }() }