我想绑定到mac os x机器上的多播DNS组和端口,以创建一些bonjour功能。但是,当我尝试绑定到端口时,我得到以下错误(顺便说一句,这是从python运行):
socket.error: [Errno 48] Address already in use
看起来mDNSResponder绑定到地址:端口,SO_REUSEADDR未设置。
是否可以以允许其他代理绑定到地址:端口组合的方式运行mDNSResponder?
答案 0 :(得分:4)
在这种情况下,错误代码描述可能会有点混乱。当应用程序绑定到端口而未设置SO_REUSEPORT选项时,如果第二个应用程序尝试绑定到同一端口,则绑定将失败并出现上述错误。问题不在于绑定地址,而在于端口和SO_REUSEPORT标志。
另外,在linux下,通过使用SO_REUSEADDR标志(按照SO_REUSEPORT on linux)实现了等效(多个多播侦听器)功能。
第一个应用程序必须与SO_REUSEPORT标志集绑定,否则它将具有独占绑定,其他应用程序绑定将失败。例如:
# For BSD based platforms.
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
sock.bind(('', MCAST_PORT))
事实证明,mDNSResponder可以在设置SO_REUSEPORT标志的情况下启动,但前提是它在启动服务时无法独占绑定。您可以执行以下操作以使其进入此模式:
mDNSResponder服务将使用SO_REUSEPORT标志启动和绑定。然后,其他应用程序可以共享端口,直到下次重新启动您可能需要重新启动任何使用bonjour的应用程序,因为它们已经注册到旧的mDNSResponder实例。