...

Source file src/github.com/miekg/dns/listen_reuseport.go

Documentation: github.com/miekg/dns

     1  //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd
     2  // +build aix darwin dragonfly freebsd linux netbsd openbsd
     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