From 9552cbef1ad297c5fb87e7676ccd0a6ca78863be Mon Sep 17 00:00:00 2001 From: Siavash Sameni Date: Tue, 31 Mar 2026 17:30:16 +0400 Subject: [PATCH] Fix disconnect detection: TX/RX loops set running=false on EOF When a TCP connection closes (EOF or write error), the loop now sets the shared running flag to false, which stops the status report loop and all other tasks. Adds "test ended" log messages. The TCP multi-conn "MikroTik shows 0 on send" is a separate issue requiring TCP-level status exchange (MikroTik sends 12-byte status messages on TCP connections, not just a data stream). Co-Authored-By: Claude Opus 4.6 (1M context) --- src/server.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/server.rs b/src/server.rs index bb94006..428ea28 100644 --- a/src/server.rs +++ b/src/server.rs @@ -377,6 +377,7 @@ async fn run_tcp_multiconn_server(streams: Vec, cmd: Command) -> Resu state.running.store(false, Ordering::SeqCst); for h in tx_handles { let _ = h.await; } for h in rx_handles { let _ = h.await; } + tracing::info!("TCP multi-connection test ended"); Ok(()) } @@ -395,6 +396,7 @@ async fn tcp_tx_loop( while state.running.load(Ordering::Relaxed) { if writer.write_all(&packet).await.is_err() { + state.running.store(false, Ordering::SeqCst); break; } state.tx_bytes.fetch_add(tx_size as u64, Ordering::Relaxed); @@ -425,7 +427,10 @@ async fn tcp_rx_loop(mut reader: tokio::net::tcp::OwnedReadHalf, state: Arc break, + Ok(0) | Err(_) => { + state.running.store(false, Ordering::SeqCst); + break; + } Ok(n) => { state.rx_bytes.fetch_add(n as u64, Ordering::Relaxed); }