1package attacker 2 3import ( 4 "context" 5 "net" 6 "sync/atomic" 7 "time" 8) 9 10type resolver struct { 11 idx uint64 12 addrs []string 13} 14 15func NewResolver(addrs []string) *net.Resolver { 16 r := &resolver{addrs: addrs} 17 18 return &net.Resolver{ 19 PreferGo: true, 20 Dial: func(ctx context.Context, network, address string) (net.Conn, error) { 21 d := net.Dialer{ 22 Timeout: time.Millisecond * time.Duration(2000), 23 } 24 return d.DialContext(ctx, network, r.address()) 25 }, 26 } 27} 28 29func (r *resolver) address() string { 30 return r.addrs[atomic.AddUint64(&r.idx, 1)%uint64(len(r.addrs))] 31} 32