Описание кода ошибки может быть немного запутанным в этой ситуации. Когда приложение связывается с портом без установки опции 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, но только в том случае, если он не может связываться исключительно при запуске службы. Чтобы перейти в этот режим, вы можете сделать следующее:
- Завершение работы службы mDNSResponder ( подробнее здесь )
- Привязать к адресу: порт с вашим приложением, используя SO_REUSEPORT
- Перезапустить службу mDNSResponder
Служба mDNSResponder будет запускаться и связываться с использованием флага SO_REUSEPORT. Другие приложения могут совместно использовать порт до следующей перезагрузки. Вам может потребоваться перезапустить любые приложения, которые используют bonjour, поскольку они будут зарегистрированы в старом экземпляре mDNSResponder.