python-2.7 - Errno 101 WIFI断开后网络无法访问,但是localhost呢?
问题描述
我有以下 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 机器上,我有一个客户端加入该组并收听这些消息,有时我也会从 LAN 中的其他机器加入该组进行调试(它们包含 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
是否会失败而不是依赖异常?
解决方案
推荐阅读
- laravel - Laravel 验证请求来自
- python - Input() 未能为名称赋值
- sql - 这里有没有在 SQL 查询中使用交叉连接的替代方法?
- python - 如何更改 tkinter 滚动条颜色
- php - Wordpress 导航菜单未显示在自定义存档页面上
- authentication - 带有角色的 Blazor WebAssembly AuthorizedView
- javascript - ListBoxFor 中使用 Bootstrap(selectpicker 类)的选项仅显示一次
- sql - SQL,如何仅检索与另一列中具有相同值的多个条目相关联的列?
- spring-boot - ElasticSearch 中的批量更新插入异常
- install4j - install4j:“执行启动器”操作不适用于“需要管理员”执行级别