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  }