2011-09-08 106 views
2

我想绑定到mac os x机器上的多播DNS组和端口,以构建一些bonjour功能的原型。然而,当我尝试绑定到该端口,我得到以下错误(顺便说一句,这是蟒蛇运行):绑定到mac os上的mdns多播地址x

socket.error: [Errno 48] Address already in use 

它看起来像mDNSResponder绑定的地址:与SO_REUSEADDR端口未设置。

是否有可能以允许其他代理绑定到address:port组合的方式运行mDNSResponder?

回答

2

在这种情况下,错误代码描述可能有点混乱。当应用程序绑定到端口而未设置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标志设置开始,但只有当它发生故障时,服务启动专门绑定。你可以做以下,使之进入该模式:

  1. 关闭mDNSResponder服务(more info here
  2. 绑定到地址:端口使用SO_REUSEPORT
  3. 您的应用程序
  4. 重新启动mDNSResponder服务

mDNSResponder服务将启动并使用SO_REUSEPORT标志进行绑定。然后其他应用程序可以共享端口,直到下一次重新引导您可能需要重新启动任何使用bonjour的应用程序,因为它们已被注册到旧的mDNSResponder实例。