From 5122e1e1c20c6fb3eca5575ece3b6008e93ddefe Mon Sep 17 00:00:00 2001 From: Andreas Poehlmann Date: Sun, 26 Oct 2025 13:02:36 +0100 Subject: [PATCH 1/2] Add error handling for socket creation in transport.py Handle socket creation and multicast membership with error handling. --- src/seabreeze/pyseabreeze/transport.py | 51 +++++++++++++++----------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/seabreeze/pyseabreeze/transport.py b/src/seabreeze/pyseabreeze/transport.py index 0452d17..7bc8e71 100644 --- a/src/seabreeze/pyseabreeze/transport.py +++ b/src/seabreeze/pyseabreeze/transport.py @@ -533,28 +533,35 @@ def list_devices(cls, **kwargs: Any) -> Iterable[IPv4TransportHandle]: # default values for multicast on HDX devices multicast_group = kwargs.get("multicast_group", "239.239.239.239") multicast_port = kwargs.get("multicast_port", 57357) - # Create the datagram (UDP) socket - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - # allow other sockets to bind this port too - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - # Set a timeout so the socket does not block - # indefinitely when trying to receive data. - sock.settimeout(kwargs.get("multicast_timeout", 1)) - sock.setsockopt( - socket.IPPROTO_IP, - socket.IP_MULTICAST_IF, - socket.inet_aton(network_adapter) if network_adapter else socket.INADDR_ANY, - ) - mreq = struct.pack( - "4sl" if not network_adapter else "4s4s", - socket.inet_aton(multicast_group), - ( - socket.INADDR_ANY - if not network_adapter - else socket.inet_aton(network_adapter) - ), - ) - sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) + try: + # Create the datagram (UDP) socket + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + # allow other sockets to bind this port too + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + # Set a timeout so the socket does not block + # indefinitely when trying to receive data. + sock.settimeout(kwargs.get("multicast_timeout", 1)) + sock.setsockopt( + socket.IPPROTO_IP, + socket.IP_MULTICAST_IF, + socket.inet_aton(network_adapter) if network_adapter else socket.INADDR_ANY, + ) + mreq = struct.pack( + "4sl" if not network_adapter else "4s4s", + socket.inet_aton(multicast_group), + ( + socket.INADDR_ANY + if not network_adapter + else socket.inet_aton(network_adapter) + ), + ) + sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) + except OSError as e: + warnings.warn( + f"Received {type(e).__name__} with '{str(e)}'. Skipping IPv4 discovery.", + stacklevel=2, + ) + return # prepare a message requesting all devices in the multicast group # to send their (USB) product id transport = IPv4Transport(OBPProtocol) From 26e90821a27488a72f25d37b69593d49d65ec49a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 26 Oct 2025 12:03:06 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/seabreeze/pyseabreeze/transport.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/seabreeze/pyseabreeze/transport.py b/src/seabreeze/pyseabreeze/transport.py index 7bc8e71..46b44fe 100644 --- a/src/seabreeze/pyseabreeze/transport.py +++ b/src/seabreeze/pyseabreeze/transport.py @@ -544,7 +544,11 @@ def list_devices(cls, **kwargs: Any) -> Iterable[IPv4TransportHandle]: sock.setsockopt( socket.IPPROTO_IP, socket.IP_MULTICAST_IF, - socket.inet_aton(network_adapter) if network_adapter else socket.INADDR_ANY, + ( + socket.inet_aton(network_adapter) + if network_adapter + else socket.INADDR_ANY + ), ) mreq = struct.pack( "4sl" if not network_adapter else "4s4s",