Skip to content

Commit a624eff

Browse files
committed
socket_comms: fix multicast sockets on Windows without IP
Fix multicast sockets on Windows when there is no multicast capable external interface. The writing socket is now unconditionally bound to the localhost interface, and the receiving socket updated to be properly bound to the multicast group on Windows. Signed-off-by: Jordan Yates <jordan@embeint.com>
1 parent aa01310 commit a624eff

1 file changed

Lines changed: 3 additions & 5 deletions

File tree

src/infuse_iot/socket_comms.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,7 @@ def __init__(self, multicast_address):
273273
# Multicast output socket
274274
self._output_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
275275
self._output_sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
276-
if sys.platform != "win32":
277-
self._output_sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton("127.0.0.1"))
276+
self._output_sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton("127.0.0.1"))
278277
self._output_addr = multicast_address
279278
# Single input socket
280279
unicast_address = ("localhost", multicast_address[1] + 1)
@@ -303,11 +302,10 @@ def __init__(self, multicast_address, rx_timeout=0.2):
303302
self._input_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
304303
self._input_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
305304
if sys.platform == "win32":
306-
self._input_sock.bind(("", multicast_address[1]))
307-
mreq = struct.pack("4sl", socket.inet_aton(multicast_address[0]), socket.INADDR_ANY)
305+
self._input_sock.bind(("127.0.0.1", multicast_address[1]))
308306
else:
309307
self._input_sock.bind(multicast_address)
310-
mreq = struct.pack("4s4s", socket.inet_aton(multicast_address[0]), socket.inet_aton("127.0.0.1"))
308+
mreq = struct.pack("4s4s", socket.inet_aton(multicast_address[0]), socket.inet_aton("127.0.0.1"))
311309
self._input_sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
312310
self._input_sock.settimeout(rx_timeout)
313311
# Unicast output socket

0 commit comments

Comments
 (0)