V2Ray пре 10 година
родитељ
комит
93625dd656
2 измењених фајлова са 48 додато и 3 уклоњено
  1. 44 0
      common/retry/retry.go
  2. 4 3
      point.go

+ 44 - 0
common/retry/retry.go

@@ -0,0 +1,44 @@
+package retry
+
+import (
+	"errors"
+	"time"
+)
+
+var (
+	RetryFailed = errors.New("All retry attempts failed.")
+)
+
+type RetryStrategy interface {
+	On(func() error) error
+}
+
+type retryer struct {
+	NextDelay func(int) int
+}
+
+func (r *retryer) On(method func() error) error {
+	attempt := 0
+	for {
+		err := method()
+		if err == nil {
+			return nil
+		}
+		delay := r.NextDelay(attempt)
+		if delay < 0 {
+			return RetryFailed
+		}
+		<-time.After(time.Duration(delay) * time.Millisecond)
+	}
+}
+
+func Timed(attempts int, delay int) RetryStrategy {
+	return &retryer{
+		NextDelay: func(attempt int) int {
+			if attempt >= attempts {
+				return -1
+			}
+			return delay
+		},
+	}
+}

+ 4 - 3
point.go

@@ -4,6 +4,7 @@ import (
 	"github.com/v2ray/v2ray-core/common/errors"
 	"github.com/v2ray/v2ray-core/common/log"
 	v2net "github.com/v2ray/v2ray-core/common/net"
+	"github.com/v2ray/v2ray-core/common/retry"
 	"github.com/v2ray/v2ray-core/config"
 )
 
@@ -90,9 +91,9 @@ func (vp *Point) Start() error {
 		return errors.NewBadConfigurationError()
 	}
 
-	err := vp.ich.Listen(vp.port)
-	// TODO: handle error
-	return err
+	return retry.Timed(100 /* times */, 100 /* ms */).On(func() error {
+		return vp.ich.Listen(vp.port)
+	})
 }
 
 func (p *Point) DispatchToOutbound(packet v2net.Packet) InboundRay {