Pregunta

Quiero unir al grupo DNS de multidifusión y puerto en una máquina Mac OS X para prototipos de alguna funcionalidad de Bonjour. Sin embargo, cuando intento unir al puerto, recibo el siguiente error (por cierto, esto se ejecuta desde Python):

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

Parece que el MDNSSponder se une a la dirección: Puerto con SO_REUSeaddr unset.

¿Es posible ejecutar el MDNSSponder de una manera que permite que otros agentes se unan a la dirección: combinación de puertos?

¿Fue útil?

Solución

La descripción del código de error puede ser un poco confuso en esta situación. Cuando una aplicación se une a un puerto sin configurar la opción SO_REUSEPORT, si una segunda aplicación intenta unirse al mismo puerto, el enlace fallará con el error anterior. Sin embargo, el problema no es con la dirección de enlace, sino con el puerto y el indicador SO_REUSEPORT.

Como aparte, en Linux la funcionalidad equivalente (múltiples oyentes de multidifusión) se logra utilizando el indicador SO_REUSeaddr (según So_reusePort en Linux).

La primera aplicación debe vincularse con el conjunto de indicadores SO_REUSEPORT, de lo contrario tendrá un enlace exclusivo y otros enlaces de aplicación fallarán. Por ejemplo:

# For BSD based platforms.
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
sock.bind(('', MCAST_PORT))

Resulta que el MDNSRESPONDER puede comenzar con el conjunto de bandera SO_REUSEPORT, pero solo si no se une exclusivamente cuando se inicia el servicio. Puede hacer lo siguiente para que ingrese a este modo:

  1. Apague el servicio MDNSSponder (Más información aquí)
  2. Atar a la dirección: puerto con su aplicación usando SO_REUSEPORT
  3. Reinicie el servicio MDNSSponder

El servicio MDNSSponder comenzará y se unirá utilizando el indicador SO_REUSEPORT. Otras aplicaciones pueden compartir el puerto hasta el siguiente reinicio. Es posible que deba reiniciar cualquier aplicación que use Bonjour, ya que se habrán registrado en la antigua instancia de MDNSSponder.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top