7

ho il seguente codice per scoprire i servizi sulla rete:NSNetServiceBrowser didRemoveService richiede più tempo dopo l'apertura di flusso

[netServiceBrowser setDelegate: self]; 
[netServiceBrowser searchForServicesOfType: serviceType inDomain: domain]; 

che si traduce in chiamate a questi due metodi (trovare servizio e rimuovere il servizio):

- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser 
     didFindService:(NSNetService*) netService ... {} 

- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser 
     didRemoveService:(NSNetService*) netService ... {} 

Questo funziona bene. Quando spengo il dispositivo I immediatamente riceve la chiamata RemoveService.

Tuttavia quando si apre una corrente (ingresso, uscita o entrambi) al dispositivo:

[netService getInputStream: &inputStream outputStream: &outputStream]; 

[inputStream setDelegate: self]; 
[outputStream setDelegate: self]; 

[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
      forMode: NSDefaultRunLoopMode]; 
[inputStream open]; 

[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
       forMode:NSDefaultRunLoopMode]; 
[outputStream open]; 

Si prende improvvisamente il NSNetServiceBrowser quasi un minuto per rilevare che ho spento il dispositivo
(ci vuole un minuto per didRemoveService da chiamare).

I dispositivi con cui non sto comunicando (apertura dei flussi con) chiamano ancora didRemoveService non appena li rimuovo.

Aggiornamento: Ecco un po 'più informazioni relative al mio problema.

Ho ho fatto funzionare una traccia con Wireshark e ho notato quanto segue:

comincio la mia applicazione nel simulatore iPad, l'applicazione si avvia un NSNetServiceBrowser e rileva la stampante. Dopodiché apre i flussi di input/output sul dispositivo (tramite airport express, usb). La stampante mi invia aggiornamenti di stato e quando tocco il pulsante di prova nella mia app , la stampante inizia a stampare. In Wireshark vedo tutte le comunicazioni con la stampante come previsto.

Ora quando avvio la stessa identica applicazione su iPad (e lascio il simulatore iPad in esecuzione). L'applicazione avvia anche il server NSNetServiceBrowser e rileva la stampante. La stampante è non mi sta inviando aggiornamenti di stato e quando tocco il pulsante di prova, la stampante non stampa. In Wireshark vedo la comunicazione. La stampante o l'aeroporto riceve i miei comandi e invia un pacchetto ACK.

Non appena ho ucciso l'app per simulatore iPad, la stampante inizia a stampare i comandi inviati dall'iPad. Sembra che aprire un socket blocca tutti gli eventi bonjour, come posso evitare che ciò accada?

Maggiori informazioni qui: https://devforums.apple.com/message/541436

+0

Non appena chiudo i flussi, FiresService ha eseguito l'attivazione. Sembra che aspetti un qualche timeout? – Zyphrax

+0

Non sono sicuro che sia questo il caso, ma date un'occhiata al flusso - (void): (NSStream *) aStream handleEvent: (NSStreamEvent) gestore di eventi. In Lion il gestore non viene più chiamato per l'evento NSStreamEventEndEncountered. Quindi, è necessario chiudere il flusso di input e rimuoverlo dal ciclo quando si è sicuri di aver ricevuto tutti i dati. Ad esempio quando avviene NSStreamEventHasBytesAvailable. – Davyd

+0

Per coloro che hanno accesso al forum degli sviluppatori Apple. Ho postato il mio problema qui: https://devforums.apple.com/it/message/541436. Purtroppo ancora nessuna soluzione :( – Zyphrax

risposta

0

Sembra essere un limite dell'Airport Express.

La mia attuale implementazione con GCDAsyncSocket funziona abbastanza bene e devo solo accertarmi che solo un socket sia utilizzato per comunicare con Airport Express.

Sto chiudendo la domanda.

0

Sono sicuro che la sua Nel Leone il gestore non viene chiamato per l'evento NSStreamEventEndEncountered più. Quindi, è necessario chiudere il flusso di input e rimuoverlo dal ciclo quando si è sicuri di aver ricevuto tutti i dati. Ad esempio quando avviene NSStreamEventHasBytesAvailable. Controllalo e suppongo che dovrebbe funzionare

+0

Purtroppo devo tenere i miei flussi di input aperti per gli aggiornamenti dei dispositivi (stampante senza carta, vassoio aperto ecc. Ecc.) Questo problema si verifica su Snow Leopard, iOS, Lion non importa. – Zyphrax

Problemi correlati