From 051d353e160c1da5bf90c64cdb711a3df7ff943b Mon Sep 17 00:00:00 2001 From: Milos Ivanovic Date: Sun, 30 Mar 2025 04:05:23 +1300 Subject: [PATCH 1/2] Fix receive method to enforce total timeout, preventing excessive wait --- icmplib/sockets.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/icmplib/sockets.py b/icmplib/sockets.py index 130f55a..79d22c5 100644 --- a/icmplib/sockets.py +++ b/icmplib/sockets.py @@ -317,20 +317,22 @@ def receive(self, request=None, timeout=2): if not self._sock: raise SocketUnavailableError - self._sock.settimeout(timeout) - time_limit = time() + timeout + start_time = time() + time_limit = start_time + timeout try: while True: + remaining_time = time_limit - time() + if remaining_time <= 0: + raise socket.timeout + + self._sock.settimeout(remaining_time) response = self._sock.recvfrom(1024) current_time = time() packet = response[0] source = response[1][0] - if current_time > time_limit: - raise socket.timeout - reply = self._parse_reply( packet=packet, source=source, From 74ce4140d3232108cdd813d6f137b209ae7d5d09 Mon Sep 17 00:00:00 2001 From: Milos Ivanovic Date: Mon, 31 Mar 2025 02:18:59 +1300 Subject: [PATCH 2/2] Ensure consistent timeout handling between sync and async receive methods - Update sync receive to use max(remaining_time, 0) for socket timeout, matching async behavior - Allows a final non-blocking read when total timeout is reached - May accept packets slightly past the timeout if data is immediately available Co-authored-by: kalvdans --- icmplib/sockets.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/icmplib/sockets.py b/icmplib/sockets.py index 79d22c5..518851d 100644 --- a/icmplib/sockets.py +++ b/icmplib/sockets.py @@ -323,10 +323,7 @@ def receive(self, request=None, timeout=2): try: while True: remaining_time = time_limit - time() - if remaining_time <= 0: - raise socket.timeout - - self._sock.settimeout(remaining_time) + self._sock.settimeout(max(remaining_time, 0)) response = self._sock.recvfrom(1024) current_time = time()