...
1
2
3
4 package dns
5
6 import (
7 "context"
8 "net"
9 "syscall"
10
11 "golang.org/x/sys/unix"
12 )
13
14 const supportsReusePort = true
15
16 func reuseportControl(network, address string, c syscall.RawConn) error {
17 var opErr error
18 err := c.Control(func(fd uintptr) {
19 opErr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEPORT, 1)
20 })
21 if err != nil {
22 return err
23 }
24
25 return opErr
26 }
27
28 const supportsReuseAddr = true
29
30 func reuseaddrControl(network, address string, c syscall.RawConn) error {
31 var opErr error
32 err := c.Control(func(fd uintptr) {
33 opErr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEADDR, 1)
34 })
35 if err != nil {
36 return err
37 }
38
39 return opErr
40 }
41
42 func listenTCP(network, addr string, reuseport, reuseaddr bool) (net.Listener, error) {
43 var lc net.ListenConfig
44 switch {
45 case reuseaddr && reuseport:
46 case reuseport:
47 lc.Control = reuseportControl
48 case reuseaddr:
49 lc.Control = reuseaddrControl
50 }
51
52 return lc.Listen(context.Background(), network, addr)
53 }
54
55 func listenUDP(network, addr string, reuseport, reuseaddr bool) (net.PacketConn, error) {
56 var lc net.ListenConfig
57 switch {
58 case reuseaddr && reuseport:
59 case reuseport:
60 lc.Control = reuseportControl
61 case reuseaddr:
62 lc.Control = reuseaddrControl
63 }
64
65 return lc.ListenPacket(context.Background(), network, addr)
66 }
67
View as plain text