diff --git a/bridge/src/main/scala/protocbridge/frontend/SocketBasedPluginFrontend.scala b/bridge/src/main/scala/protocbridge/frontend/SocketBasedPluginFrontend.scala index 6d1dd59..d969525 100644 --- a/bridge/src/main/scala/protocbridge/frontend/SocketBasedPluginFrontend.scala +++ b/bridge/src/main/scala/protocbridge/frontend/SocketBasedPluginFrontend.scala @@ -2,7 +2,7 @@ package protocbridge.frontend import protocbridge.{ExtraEnv, ProtocCodeGenerator} -import java.net.ServerSocket +import java.net.{InetAddress, ServerSocket} import java.nio.file.{Files, Path} import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.{Future, blocking} @@ -10,13 +10,19 @@ import scala.concurrent.{Future, blocking} /** PluginFrontend for Windows and macOS where a server socket is used. */ abstract class SocketBasedPluginFrontend extends PluginFrontend { + case class InternalState(serverSocket: ServerSocket, shellScript: Path) override def prepare( plugin: ProtocCodeGenerator, env: ExtraEnv ): (Path, InternalState) = { - val ss = new ServerSocket(0) // Bind to any available port. + + /** we need to specify an address, otherwise it uses ANY (*.* in netstat) + * which does not conflict with existing 'localhost' sockets on macos, + * resulting in a conflict later on in MacPluginFrontend + */ + val ss = new ServerSocket(0, 50, InetAddress.getByName("127.0.0.1")) val sh = createShellScript(ss.getLocalPort) Future {