github.com/palisadeinc/bor@v0.0.0-20230615125219-ab7196213d15/common/network/port.go (about) 1 package network 2 3 import ( 4 "errors" 5 "fmt" 6 "net" 7 ) 8 9 const ( 10 maxPortCheck = 100 11 12 emptyPort = "127.0.0.1:0" 13 ) 14 15 var ( 16 ErrCantFindAPort = errors.New("no available port found") 17 ) 18 19 // FindAvailablePort returns the an available port 20 func FindAvailablePort() (int, net.Listener, error) { 21 var ( 22 listener net.Listener 23 err error 24 ) 25 26 for i := uint(0); i < maxPortCheck; i++ { 27 listener, err = net.Listen("tcp", emptyPort) 28 if err != nil { 29 continue 30 } 31 32 return listener.Addr().(*net.TCPAddr).Port, listener, nil 33 } 34 35 return 0, nil, fmt.Errorf("%w: %s", ErrCantFindAPort, err) 36 }