Bind to MDNS Indirizzo multicast su Mac OS X
Domanda
Voglio legarmi al gruppo DNS multicast e alla porta su una macchina Mac OS X per prototipare alcune funzionalità di Bonjour. Tuttavia, quando provo a legarsi alla porta ottengo il seguente errore (per inciso questo viene eseguito da Python):
socket.error: [Errno 48] Address already in use
Sembra che MdnsResponder si leghi all'indirizzo: Porta con SO_REUSEADDR UNSET.
È possibile eseguire il MDNSResponder in un modo che consente ad altri agenti di vincere all'indirizzo: la combinazione di porte?
Soluzione
La descrizione del codice di errore può essere un po 'confusa in questa situazione. Quando un'applicazione si lega a una porta senza impostare l'opzione SO_REUSEPORT, se una seconda applicazione tenta di legarsi alla stessa porta, il bind non riuscirà con l'errore sopra. Il problema non è però con l'indirizzo vincolante, ma con la porta e il flag SO_REUSEPORT.
A parte questo, sotto Linux la funzionalità equivalente (più ascoltatori multicast) si ottiene utilizzando il flag SO_REUSEADDR (secondo per So_reusePort su Linux).
La prima applicazione deve essere legata al set di flag SO_REUSEPORT, altrimenti avrà un bind esclusivo e altri bind dell'applicazione falliranno. Per esempio:
# For BSD based platforms.
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
sock.bind(('', MCAST_PORT))
Si scopre che il MDNSResponder può iniziare con il set di flag SO_REUSEPORT, ma solo se non riesce a legarsi esclusivamente all'avvio del servizio. Puoi fare quanto segue per farlo andare in questa modalità:
- Spegnere il servizio MDNSResponder (Maggiori informazioni qui)
- Bind to the Address: Port con l'applicazione utilizzando SO_REUSEPORT
- Riavvia il servizio MDNSResponder
Il servizio MDNSResponder inizierà e legato usando il flag SO_REUSEPORT. Altre applicazioni possono quindi condividere la porta fino al riavvio successivo. Potrebbe essere necessario riavviare tutte le applicazioni che utilizzano Bonjour in quanto saranno state registrate nella vecchia istanza MDNSResponder.