2011-09-08 67 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實例。