Привязать к многоадресному адресу mdns на mac os x

Я хочу привязаться к многоадресной группе DNS и порту на машине Mac OS X, чтобы создать прототип некоторых функций bonjour. Однако, когда я пытаюсь привязаться к порту, я получаю следующую ошибку (кстати, это запускается из python):

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

Похоже, что mDNSResponder привязывается к адресу: порт с неустановленным SO_REUSEADDR.

Можно ли запустить mDNSResponder таким образом, чтобы другие агенты могли связываться с комбинацией адрес: порт?


person atikat    schedule 08.09.2011    source источник


Ответы (1)


В этой ситуации описание кода ошибки может немного сбивать с толку. Когда приложение привязывается к порту без установки параметра SO_REUSEPORT, если второе приложение пытается привязаться к тому же порту, привязка завершится с ошибкой, указанной выше. Проблема не в адресе привязки, а в порте и флаге SO_REUSEPORT.

Кроме того, в Linux эквивалентная функциональность (несколько прослушивателей многоадресной рассылки) достигается с помощью флага SO_REUSEADDR (согласно SO_REUSEPORT в 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 (подробнее здесь)
  2. Привяжите к адресу: порт вашего приложения, используя SO_REUSEPORT
  3. Перезапустите службу mDNSResponder.

Служба mDNSResponder запустится и привяжется с использованием флага SO_REUSEPORT. Затем другие приложения могут совместно использовать порт до следующей перезагрузки. Вам может потребоваться перезапустить все приложения, использующие bonjour, поскольку они будут зарегистрированы в старом экземпляре mDNSResponder.

person atikat    schedule 09.09.2011