Errno 101 Сеть недоступна после отключения WIFI, но как насчет localhost? - PullRequest
0 голосов
/ 13 октября 2018

У меня есть следующий класс Python

class MultiCast():
  def sendMessage(self, message):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, struct.pack('b', 5))
    sock.sendto(message, ('227.0.0.1', 12345))
    sock.close()
multicast = MultiCast()

, который я затем использую, вызывая multicast.sendMessage('text').

На той же машине Linux у меня есть клиент, который присоединяется к этой группе и слушаетэти сообщения, иногда я также присоединяюсь к этой группе с других машин в локальной сети для отладки (они содержат обработанные повторные передачи GPS-приемника).

Проблема заключается в том, что когда соединение WIFI потеряно (оно работает на ноутбуке)), sock.sendto(message, ('227.0.0.1', 12345)) выдает исключение sock.error: [Errno 101] Network is unreachable

У меня сложилось впечатление, что потеря этого соединения WIFI вообще не должна иметь никакого эффекта, так как еще есть интерфейс localhost, который нужно обслуживать.Я думал, что сообщения были отправлены на все доступные интерфейсы.

Как я могу решить эту проблему?Многоадресный клиент на том же компьютере должен иметь возможность принимать эти многоадресные сообщения независимо от состояния соединения WIFI.

Замена соответствующего кода на вариант широковещания также показывает ту же проблему.

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.sendto(message, ('<broadcast>', 12345))
sock.close()

----

Я продолжал заниматься этой проблемой, и наиболее подходящим решением является следующее.Я не знаю, является ли это рекомендуемым подходом, но я буду использовать его пока, пока кто-нибудь не сможет помочь мне правильно решить эту проблему.

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, struct.pack('b', 5))
try:
  # print 'multicast'
  sock.sendto(message, ('228.0.0.5', 12345))
except:
  # print 'localhost fallback'
  sock.sendto(message, ('127.0.0.5', 12345))
sock.close()

Есть ли способ проверить заранее при отправке228.0.0.5 потерпит неудачу вместо того, чтобы полагаться на исключения?

...