package engine import ( "fmt" "net" "vpnem/internal/config" ) var localProxyPortCandidates = []int{config.LocalProxyPort, 10808, 10880, 18080, 20800} func ResolveLocalProxyPort() (int, error) { for _, port := range localProxyPortCandidates { if localProxyPortAvailable(port) { return port, nil } } listener, err := net.Listen("tcp", net.JoinHostPort(config.LocalProxyHost, "0")) if err != nil { return 0, err } defer listener.Close() addr, ok := listener.Addr().(*net.TCPAddr) if !ok { return 0, fmt.Errorf("unexpected listener addr type %T", listener.Addr()) } return addr.Port, nil } func localProxyPortAvailable(port int) bool { listener, err := net.Listen("tcp", net.JoinHostPort(config.LocalProxyHost, fmt.Sprintf("%d", port))) if err != nil { return false } _ = listener.Close() return true }