diff --git a/src/Simplex/RemoteControl/Discovery.hs b/src/Simplex/RemoteControl/Discovery.hs index 4a69a57a1..7f4795932 100644 --- a/src/Simplex/RemoteControl/Discovery.hs +++ b/src/Simplex/RemoteControl/Discovery.hs @@ -80,12 +80,17 @@ preferAddress RCCtrlAddress {address, interface} addrs = startTLSServer :: Maybe Word16 -> TMVar (Maybe N.PortNumber) -> TLS.Credential -> TLS.ServerHooks -> (Transport.TLS 'TServer -> IO ()) -> IO (Async ()) startTLSServer port_ startedOnPort credentials hooks server = async . liftIO $ do started <- newEmptyTMVarIO - bracketOnError (startTCPServer started Nothing $ maybe "0" show port_) (\_e -> setPort Nothing) $ \socket -> + bracketOnError (startTCPServerCtrl started $ maybe "0" show port_) (\_e -> setPort Nothing) $ \socket -> ifM (atomically $ readTMVar started) (runServer started socket) (setPort Nothing) where + -- Bind preferring IPv6 (dual-stack) as before; if that fails (e.g. IPv6 is + -- disabled), fall back to IPv4 so the (IPv4-only) invitation stays reachable. + startTCPServerCtrl started port = + startTCPServer started Nothing port + `catchAny` \_ -> startTCPServer started (Just "0.0.0.0") port runServer started socket = do port <- N.socketPort socket logInfo $ "System-assigned port: " <> tshow port