Se lient à mdns d'adresses de multidiffusion sur le x mac
Question
Je veux lier au groupe DNS multicast et le port sur une machine x mac os au prototype certaines fonctionnalités de BONJOUR. Cependant, lorsque je tente de se lier au port, je reçois l'erreur suivante (soit dit en passant cela est exécuté à partir de python):
socket.error: [Errno 48] Address already in use
Il semble que les lie mDNSResponder à l'adresse suivante:. Le port avec SO_REUSEADDR unset
Est-il possible d'exécuter le mDNSResponder d'une manière qui permet à d'autres agents se lient à l'adresse: combinaison de port
La solution
La description du code d'erreur peut être un peu déroutant dans cette situation. Lorsqu'un binds d'application à un port sans réglage de l'option SO_REUSEPORT, si une deuxième application tente de se lier au même port la liaison échouera avec l'erreur ci-dessus. Le problème est pas avec l'adresse de liaison bien, mais avec le port et le drapeau de SO_REUSEPORT.
En aparté, sous Linux, la fonctionnalité équivalente (plusieurs auditeurs de multidiffusion) est obtenue en utilisant l'indicateur de SO_REUSEADDR (selon SO_REUSEPORT sur linux ).
La première application doit se lier avec le drapeau de SO_REUSEPORT, sinon il aura une liaison exclusive et d'autres binds d'application échouera. Par exemple:
# For BSD based platforms.
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
sock.bind(('', MCAST_PORT))
Il se trouve que le mDNSResponder peut commencer par l'indicateur de SO_REUSEPORT, mais seulement si elle ne se lie pas exclusivement lorsque le service est démarré. Vous pouvez faire ce qui suit pour le faire entrer dans ce mode:
- Arrêter le service mDNSResponder ( plus d'infos ici )
- Bind à l'adresse: port avec votre application à l'aide SO_REUSEPORT
- Redémarrez le service mDNSResponder
Le service mDNSResponder commencera et se lient en utilisant le drapeau SO_REUSEPORT. D'autres applications peuvent ensuite partager le port jusqu'à ce que le prochain redémarrage. Vous devrez peut-être redémarrer toutes les applications qui utilisent comme ils Bonjour ont été enregistrés à l'ancienne instance de mDNSResponder.