Browse Source

refresher prototype

Darien Raymond 8 years ago
parent
commit
2eb313d0c2
2 changed files with 45 additions and 1 deletions
  1. 15 0
      app/receiver/config.go
  2. 30 1
      app/receiver/receiver.go

+ 15 - 0
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
+}

+ 30 - 1
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)
+		}
+	}()
 }