Привязать к многоадресному адресу MDN на Mac OS X - PullRequest
2 голосов
/ 08 сентября 2011

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

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

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

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

1 Ответ

4 голосов
/ 09 сентября 2011

Описание кода ошибки может быть немного запутанным в этой ситуации. Когда приложение связывается с портом без установки опции 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.

...