代码之家  ›  专栏  ›  技术社区  ›  Daniel F

断开WIFI连接后无法访问Errno 101网络,但localhost呢?

  •  1
  • Daniel F  · 技术社区  · 6 年前

    我有以下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连接根本不会有任何影响,因为仍然有本地主机接口需要服务。我以为这些信息被发送到所有可用的接口。

    我该如何处理这个问题?同一台机器上的多播客户端应该仍然能够接收这些多播消息,而不管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 会失败而不是依赖例外?

    0 回复  |  直到 6 年前