diff --git a/image_pusher/TCPStreamPusher.cpp b/image_pusher/TCPStreamPusher.cpp index 7d8fb88d..c013d3cc 100644 --- a/image_pusher/TCPStreamPusher.cpp +++ b/image_pusher/TCPStreamPusher.cpp @@ -42,8 +42,14 @@ void TCPStreamPusher::StartDataCollection(StartMessage &message) { serializer.SerializeSequenceStart(message); socket[i]->SetRunNumber(run_number); - if (!socket[i]->Send(serialization_buffer.data(), serializer.GetBufferSize(), TCPFrameType::START)) - throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "Timeout/failure sending START"); + if (!socket[i]->Send(serialization_buffer.data(), serializer.GetBufferSize(), TCPFrameType::START)) { + // one-shot recovery: reconnect and retry START once + if (!socket[i]->AcceptConnection(std::chrono::seconds(5)) || + !socket[i]->Send(serialization_buffer.data(), serializer.GetBufferSize(), TCPFrameType::START)) { + throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, + "Timeout/failure sending START"); + } + } } for (auto &s : socket) diff --git a/image_pusher/TCPStreamPusherSocket.cpp b/image_pusher/TCPStreamPusherSocket.cpp index 489c0498..ef4291ec 100644 --- a/image_pusher/TCPStreamPusherSocket.cpp +++ b/image_pusher/TCPStreamPusherSocket.cpp @@ -99,8 +99,14 @@ void TCPStreamPusherSocket::CloseDataSocket() { bool TCPStreamPusherSocket::AcceptConnection(std::chrono::milliseconds timeout) { std::unique_lock ul(send_mutex); - CloseDataSocket(); + // Reuse existing healthy connection instead of always forcing reconnect. + if (fd.load() >= 0 && IsConnectionAlive()) { + broken = false; + logger.Info("TCP peer already connected on " + endpoint + ", reusing existing connection"); + return true; + } + CloseDataSocket(); broken = false; pollfd pfd{};