Skip to content

Commit 5122e1e

Browse files
authored
Add error handling for socket creation in transport.py
Handle socket creation and multicast membership with error handling.
1 parent 2f9598c commit 5122e1e

File tree

1 file changed

+29
-22
lines changed

1 file changed

+29
-22
lines changed

src/seabreeze/pyseabreeze/transport.py

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -533,28 +533,35 @@ def list_devices(cls, **kwargs: Any) -> Iterable[IPv4TransportHandle]:
533533
# default values for multicast on HDX devices
534534
multicast_group = kwargs.get("multicast_group", "239.239.239.239")
535535
multicast_port = kwargs.get("multicast_port", 57357)
536-
# Create the datagram (UDP) socket
537-
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
538-
# allow other sockets to bind this port too
539-
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
540-
# Set a timeout so the socket does not block
541-
# indefinitely when trying to receive data.
542-
sock.settimeout(kwargs.get("multicast_timeout", 1))
543-
sock.setsockopt(
544-
socket.IPPROTO_IP,
545-
socket.IP_MULTICAST_IF,
546-
socket.inet_aton(network_adapter) if network_adapter else socket.INADDR_ANY,
547-
)
548-
mreq = struct.pack(
549-
"4sl" if not network_adapter else "4s4s",
550-
socket.inet_aton(multicast_group),
551-
(
552-
socket.INADDR_ANY
553-
if not network_adapter
554-
else socket.inet_aton(network_adapter)
555-
),
556-
)
557-
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
536+
try:
537+
# Create the datagram (UDP) socket
538+
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
539+
# allow other sockets to bind this port too
540+
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
541+
# Set a timeout so the socket does not block
542+
# indefinitely when trying to receive data.
543+
sock.settimeout(kwargs.get("multicast_timeout", 1))
544+
sock.setsockopt(
545+
socket.IPPROTO_IP,
546+
socket.IP_MULTICAST_IF,
547+
socket.inet_aton(network_adapter) if network_adapter else socket.INADDR_ANY,
548+
)
549+
mreq = struct.pack(
550+
"4sl" if not network_adapter else "4s4s",
551+
socket.inet_aton(multicast_group),
552+
(
553+
socket.INADDR_ANY
554+
if not network_adapter
555+
else socket.inet_aton(network_adapter)
556+
),
557+
)
558+
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
559+
except OSError as e:
560+
warnings.warn(
561+
f"Received {type(e).__name__} with '{str(e)}'. Skipping IPv4 discovery.",
562+
stacklevel=2,
563+
)
564+
return
558565
# prepare a message requesting all devices in the multicast group
559566
# to send their (USB) product id
560567
transport = IPv4Transport(OBPProtocol)

0 commit comments

Comments
 (0)