From 1f7157aa845f3a75f42ce7594fcbcab20e4775dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=99=E6=B3=93=E9=93=AE?= Date: Thu, 20 Feb 2025 21:37:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DGetFreePort=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=AB=AF=E5=8F=A3=E5=B7=B2=E8=A2=AB=E5=8D=A0=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/builtin/utils.go | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/internal/builtin/utils.go b/internal/builtin/utils.go index d29180c0..20eb363c 100644 --- a/internal/builtin/utils.go +++ b/internal/builtin/utils.go @@ -354,21 +354,19 @@ func ConvertToStringSlice(val interface{}) ([]string, error) { } func GetFreePort() (int, error) { - addr, err := net.ResolveTCPAddr("tcp", "localhost:0") - if err != nil { - return 0, errors.Wrap(err, "resolve tcp addr failed") - } - - l, err := net.ListenTCP("tcp", addr) - if err != nil { - return 0, errors.Wrap(err, "listen tcp addr failed") - } - defer func() { - if err = l.Close(); err != nil { - log.Error().Err(err).Msg(fmt.Sprintf("close addr %s error", l.Addr().String())) + minPort := 20000 + maxPort := 50000 + rand.Seed(time.Now().UnixNano()) + for i := 0; i < 10; i++ { + port := rand.Intn(maxPort-minPort+1) + minPort + addr := fmt.Sprintf("0.0.0.0:%d", port) + l, err := net.Listen("tcp", addr) + if err == nil { + defer l.Close() // 端口成功绑定后立即释放,返回该端口号 + return port, nil } - }() - return l.Addr().(*net.TCPAddr).Port, nil + } + return 0, errors.New("failed to find available port in range") } func GetCurrentDay() string {