Вопрос

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

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

Похоже, что mdnsresponder связывает адрес: порт с so_reuseaddr unset.

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top