newTempBindSocket creates a temporary socket to use as a parking spot for an address bind. The returned socket has SO_REUSEADDR and SO_REUSEPORT set to 1.
(domain int)
| 835 | // newTempBindSocket creates a temporary socket to use as a parking spot for an |
| 836 | // address bind. The returned socket has SO_REUSEADDR and SO_REUSEPORT set to 1. |
| 837 | func newTempBindSocket(domain int) (*fd.FD, error) { |
| 838 | ret, err := unix.Socket(domain, unix.SOCK_STREAM, unix.IPPROTO_TCP) |
| 839 | if err != nil { |
| 840 | return nil, fmt.Errorf("create temp bind socket: %w", err) |
| 841 | } |
| 842 | fd := fd.NewFD(ret) |
| 843 | defer fd.DecRef() |
| 844 | |
| 845 | if err := unix.SetsockoptInt(fd.FD(), unix.SOL_SOCKET, unix.SO_REUSEADDR, 1); err != nil { |
| 846 | unix.Close(fd.FD()) |
| 847 | return nil, fmt.Errorf("set SO_REUSEADDR: %w", err) |
| 848 | } |
| 849 | if err := unix.SetsockoptInt(fd.FD(), unix.SOL_SOCKET, unix.SO_REUSEPORT, 1); err != nil { |
| 850 | unix.Close(fd.FD()) |
| 851 | return nil, fmt.Errorf("set SO_REUSEPORT: %w", err) |
| 852 | } |
| 853 | return fd, nil |
| 854 | } |
| 855 | |
| 856 | func getEphemeralLoopbackAddr(domain int) ([]byte, error) { |
| 857 | arr, err := net.Interfaces() |