You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

listen_reuseport.go 881B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. // +build go1.11
  2. // +build aix darwin dragonfly freebsd linux netbsd openbsd
  3. package dns
  4. import (
  5. "context"
  6. "net"
  7. "syscall"
  8. "golang.org/x/sys/unix"
  9. )
  10. const supportsReusePort = true
  11. func reuseportControl(network, address string, c syscall.RawConn) error {
  12. var opErr error
  13. err := c.Control(func(fd uintptr) {
  14. opErr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEPORT, 1)
  15. })
  16. if err != nil {
  17. return err
  18. }
  19. return opErr
  20. }
  21. func listenTCP(network, addr string, reuseport bool) (net.Listener, error) {
  22. var lc net.ListenConfig
  23. if reuseport {
  24. lc.Control = reuseportControl
  25. }
  26. return lc.Listen(context.Background(), network, addr)
  27. }
  28. func listenUDP(network, addr string, reuseport bool) (net.PacketConn, error) {
  29. var lc net.ListenConfig
  30. if reuseport {
  31. lc.Control = reuseportControl
  32. }
  33. return lc.ListenPacket(context.Background(), network, addr)
  34. }