Skip to content

Commit e51d93c

Browse files
authored
Merge pull request #296 from ap--/fix-no-ip
Add error handling for socket creation in transport.py
2 parents 4a3c01b + 26e9082 commit e51d93c

File tree

1 file changed

+33
-22
lines changed

1 file changed

+33
-22
lines changed

src/seabreeze/pyseabreeze/transport.py

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -533,28 +533,39 @@ 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+
(
548+
socket.inet_aton(network_adapter)
549+
if network_adapter
550+
else socket.INADDR_ANY
551+
),
552+
)
553+
mreq = struct.pack(
554+
"4sl" if not network_adapter else "4s4s",
555+
socket.inet_aton(multicast_group),
556+
(
557+
socket.INADDR_ANY
558+
if not network_adapter
559+
else socket.inet_aton(network_adapter)
560+
),
561+
)
562+
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
563+
except OSError as e:
564+
warnings.warn(
565+
f"Received {type(e).__name__} with '{str(e)}'. Skipping IPv4 discovery.",
566+
stacklevel=2,
567+
)
568+
return
558569
# prepare a message requesting all devices in the multicast group
559570
# to send their (USB) product id
560571
transport = IPv4Transport(OBPProtocol)

0 commit comments

Comments
 (0)