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