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?

È stato utile?

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à:

  1. Spegnere il servizio MDNSResponder (Maggiori informazioni qui)
  2. Bind to the Address: Port con l'applicazione utilizzando SO_REUSEPORT
  3. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top