diff --git a/cura/BackendPlugin.py b/cura/BackendPlugin.py index 14e47e8d9fb..7729f6bbfc6 100644 --- a/cura/BackendPlugin.py +++ b/cura/BackendPlugin.py @@ -1,5 +1,6 @@ # Copyright (c) 2023 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import socket import subprocess from typing import Optional, List @@ -42,6 +43,15 @@ def getPort(self) -> int: def getAddress(self) -> str: return self._plugin_address + def setAvailablePort(self) -> None: + """ + Sets the port to a random available port. + """ + sock = socket.socket() + sock.bind((self.getAddress(), 0)) + port = sock.getsockname()[1] + self.setPort(port) + def _validatePluginCommand(self) -> list[str]: """ Validate the plugin command and add the port parameter if it is missing. diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index e64fb491916..1e965f5e8c9 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -83,7 +83,6 @@ def __init__(self) -> None: os.path.join(CuraApplication.getInstallPrefix(), "bin"), os.path.dirname(os.path.abspath(sys.executable)), ] - self._last_backend_plugin_port = self._port + 1000 for path in search_path: engine_path = os.path.join(path, executable_name) if os.path.isfile(engine_path): @@ -205,8 +204,7 @@ def startPlugins(self) -> None: for backend_plugin in backend_plugins: # Set the port to prevent plugins from using the same one. if backend_plugin.getPort() < 1: - backend_plugin.setPort(self._last_backend_plugin_port) - self._last_backend_plugin_port += 1 + backend_plugin.setAvailablePort() backend_plugin.start() def stopPlugins(self) -> None: