我想绑定到 mac os x 机器上的多播 DNS 组和端口来原型化一些 bonjour 功能。但是,当我尝试绑定到端口时,出现以下错误(顺便说一下,这是从 python 运行的):
socket.error: [Errno 48] Address already in use
看起来 mDNSResponder 绑定到地址:未设置 SO_REUSEADDR 的端口。
是否可以以让其他代理绑定到地址:端口组合的方式运行 mDNSResponder?
在这种情况下,错误代码描述可能会有些混乱。当应用程序在未设置 SO_REUSEPORT 选项的情况下绑定到端口时,如果第二个应用程序尝试绑定到同一端口,则绑定将失败并出现上述错误。问题不在于绑定地址,而在于端口和 SO_REUSEPORT 标志。
顺便说一句,在 linux 下,等效(多个多播侦听器)功能是通过使用 SO_REUSEADDR 标志(根据linux 上的 SO_REUSEPORT )实现的。
第一个应用程序必须使用 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 实例。