From 93097f65ea9ae8c2c9c85481ba2cf7d0139480cb Mon Sep 17 00:00:00 2001 From: Acts1631 Date: Tue, 4 Aug 2026 11:47:51 -0400 Subject: [PATCH] Traversal: update pending-packet time on socket timeout Pending traversal packets were only expired after receive events. If a client did not acknowledge a response and no more packets arrived, the server retained the pending entry indefinitely. Update the current time before handling socket timeouts. Pending packets will then retry and expire while the server is idle. --- Source/Core/Common/TraversalServer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Core/Common/TraversalServer.cpp b/Source/Core/Common/TraversalServer.cpp index d1a93793a2..262bb22a70 100644 --- a/Source/Core/Common/TraversalServer.cpp +++ b/Source/Core/Common/TraversalServer.cpp @@ -470,6 +470,9 @@ int main() FD_SET(sock, &readSet); FD_SET(sockAlt, &readSet); rv = select(std::max(sock, sockAlt) + 1, &readSet, nullptr, nullptr, &tv); + currentTime = std::chrono::duration_cast( + std::chrono::steady_clock::now().time_since_epoch()) + .count(); if (rv < 0) { if (errno != EINTR && errno != EAGAIN) @@ -499,9 +502,6 @@ int main() // note: switch to recvmmsg (yes, mmsg) if this becomes // expensive rv = recvfrom(recvsock, &packet, sizeof(packet), 0, (sockaddr*)&raddr, &addrLen); - currentTime = std::chrono::duration_cast( - std::chrono::system_clock::now().time_since_epoch()) - .count(); if (rv < 0) { if (errno != EINTR && errno != EAGAIN)