Skip to content

Commit f89e23a

Browse files
authored
Merge pull request #85 from bdraco/fix_stop_no_ipv6_thread
Ensure IPv4 still works if IPv6 is not available on the system
2 parents ef63be8 + 8f28e4f commit f89e23a

File tree

1 file changed

+31
-26
lines changed

1 file changed

+31
-26
lines changed

wsdiscovery/threaded.py

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -388,33 +388,36 @@ def _startThreads(self):
388388
return
389389

390390
self._networkingThread_v4 = NetworkingThreadIPv4(self)
391-
self._networkingThread_v6 = NetworkingThreadIPv6(self)
392391
self._networkingThread_v4.start()
393-
self._networkingThread_v6.start()
394-
logger.debug("networking threads started")
395-
396392
self._addrsMonitorThread_v4 = AddressMonitorThread(self, socket.AF_INET)
397-
self._addrsMonitorThread_v6 = AddressMonitorThread(self, socket.AF_INET6)
398393
self._addrsMonitorThread_v4.start()
399-
self._addrsMonitorThread_v6.start()
394+
logger.debug("networking threads started")
395+
396+
try:
397+
self._networkingThread_v6 = NetworkingThreadIPv6(self)
398+
self._networkingThread_v6.start()
399+
self._addrsMonitorThread_v6 = AddressMonitorThread(self, socket.AF_INET6)
400+
self._addrsMonitorThread_v6.start()
401+
except OSError as e:
402+
logger.debug("IPv6 not supported: %s", e)
403+
self._networkingThread_v6 = None
404+
self._addrsMonitorThread_v6 = None
400405
logger.debug("address monitoring threads started")
401406

402407
def _stopThreads(self):
403-
if self._networkingThread_v4 is None:
404-
return
405-
406-
self._networkingThread_v4.schedule_stop()
407-
self._addrsMonitorThread_v4.schedule_stop()
408-
self._networkingThread_v6.schedule_stop()
409-
self._addrsMonitorThread_v6.schedule_stop()
410-
411-
self._networkingThread_v4.join()
412-
self._addrsMonitorThread_v4.join()
413-
self._networkingThread_v6.join()
414-
self._addrsMonitorThread_v6.join()
415-
416-
self._networkingThread_v4 = None
417-
self._networkingThread_v6 = None
408+
if self._networkingThread_v4 is not None:
409+
self._networkingThread_v4.schedule_stop()
410+
self._addrsMonitorThread_v4.schedule_stop()
411+
self._networkingThread_v4.join()
412+
self._addrsMonitorThread_v4.join()
413+
self._networkingThread_v4 = None
414+
415+
if self._networkingThread_v6 is not None:
416+
self._networkingThread_v6.schedule_stop()
417+
self._addrsMonitorThread_v6.schedule_stop()
418+
self._networkingThread_v6.join()
419+
self._addrsMonitorThread_v6.join()
420+
self._networkingThread_v6 = None
418421

419422
def start(self):
420423
"""start networking - should be called before using other methods"""
@@ -430,23 +433,24 @@ def addSourceAddr(self, addr):
430433
version = ipaddress.ip_address(addr).version
431434
if version == 4:
432435
self._networkingThread_v4.addSourceAddr(addr)
433-
elif version == 6:
436+
elif version == 6 and self._networkingThread_v6 is not None:
434437
self._networkingThread_v6.addSourceAddr(addr)
435438

436439
def removeSourceAddr(self, addr):
437440
version = ipaddress.ip_address(addr).version
438441
if version == 4:
439442
self._networkingThread_v4.removeSourceAddr(addr)
440-
elif version == 6:
443+
elif version == 6 and self._networkingThread_v6 is not None:
441444
self._networkingThread_v6.removeSourceAddr(addr)
442445

443446
def sendUnicastMessage(self, env, host, port, initialDelay=0,
444447
unicast_num=UNICAST_UDP_REPEAT):
445448
"handle unicast message sending"
446449
self._networkingThread_v4.addUnicastMessage(env, host, port,
447450
initialDelay, unicast_num)
448-
self._networkingThread_v6.addUnicastMessage(env, host, port,
449-
initialDelay, unicast_num)
451+
if self._networkingThread_v6 is not None:
452+
self._networkingThread_v6.addUnicastMessage(env, host, port,
453+
initialDelay, unicast_num)
450454

451455
def sendMulticastMessage(self, env, initialDelay=0,
452456
multicast_num=MULTICAST_UDP_REPEAT):
@@ -456,7 +460,8 @@ def sendMulticastMessage(self, env, initialDelay=0,
456460
MULTICAST_PORT,
457461
initialDelay,
458462
multicast_num)
459-
self._networkingThread_v6.addMulticastMessage(env,
463+
if self._networkingThread_v6 is not None:
464+
self._networkingThread_v6.addMulticastMessage(env,
460465
MULTICAST_IPV6_ADDRESS,
461466
MULTICAST_PORT,
462467
initialDelay,

0 commit comments

Comments
 (0)