我有以下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
是否失败而不是依赖异常?