diff --git a/app/src/androidMain/kotlin/com/aerotoss/transfer/AndroidTransferManager.kt b/app/src/androidMain/kotlin/com/aerotoss/transfer/AndroidTransferManager.kt index 125deda..68425b3 100644 --- a/app/src/androidMain/kotlin/com/aerotoss/transfer/AndroidTransferManager.kt +++ b/app/src/androidMain/kotlin/com/aerotoss/transfer/AndroidTransferManager.kt @@ -37,6 +37,7 @@ class AndroidFileTransferManager(private val context: Context) : TransferManager private var serverThread: Thread? = null private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) private val activeJobs = ConcurrentHashMap() + private val activeSockets = ConcurrentHashMap() private val running = AtomicBoolean(false) private val connectionLimiter = Semaphore(10) @@ -220,6 +221,7 @@ class AndroidFileTransferManager(private val context: Context) : TransferManager val job = scope.launch { try { val socket = Socket(targetHost, targetPort) + activeSockets[requestId] = socket socket.use { sock -> sock.soTimeout = 30_000 val input = DataInputStream(sock.getInputStream()) @@ -300,6 +302,8 @@ class AndroidFileTransferManager(private val context: Context) : TransferManager override fun cancelTransfer(requestId: String) { activeJobs[requestId]?.cancel() activeJobs.remove(requestId) + activeSockets[requestId]?.let { try { it.close() } catch (_: Exception) {} } + activeSockets.remove(requestId) updateOutgoingById(requestId, _outgoingTransfers.value.find { it.id == requestId }?.copy( state = TransferState.CANCELLED ) ?: return) diff --git a/app/src/desktopMain/kotlin/com/aerotoss/transfer/DesktopTransferManager.kt b/app/src/desktopMain/kotlin/com/aerotoss/transfer/DesktopTransferManager.kt index 73faf3e..e6c30d7 100644 --- a/app/src/desktopMain/kotlin/com/aerotoss/transfer/DesktopTransferManager.kt +++ b/app/src/desktopMain/kotlin/com/aerotoss/transfer/DesktopTransferManager.kt @@ -31,6 +31,7 @@ class DesktopFileTransferManager : TransferManager { } private val transferStates = ConcurrentHashMap>() + private val activeSockets = ConcurrentHashMap() private var serverSocket: ServerSocket? = null private var serverThread: Thread? = null @@ -218,6 +219,7 @@ class DesktopFileTransferManager : TransferManager { val job = scope.launch { try { val socket = Socket(targetHost, targetPort) + activeSockets[requestId] = socket socket.use { sock -> sock.soTimeout = 30_000 val input = DataInputStream(sock.getInputStream()) @@ -292,6 +294,8 @@ class DesktopFileTransferManager : TransferManager { override fun cancelTransfer(requestId: String) { activeJobs[requestId]?.cancel() activeJobs.remove(requestId) + activeSockets[requestId]?.let { try { it.close() } catch (_: Exception) {} } + activeSockets.remove(requestId) transferStates[requestId]?.let { flow -> flow.value = flow.value.copy(state = TransferState.CANCELLED) updateOutgoing(flow.value)