objective-c stream bonjour nsnetservice nsnetservicebrowser

objective c - NSNetServiceBrowser didRemoveService tarda más tiempo después de abrir la transmisión



objective-c stream (2)

Tengo el siguiente código para descubrir servicios en la red:

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

Eso da como resultado llamadas a estos dos métodos (buscar servicio y eliminar servicio):

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

Esto funciona bien Cuando apago mi dispositivo, recibo inmediatamente la llamada didRemoveService .

Sin embargo, cuando abro una transmisión (entrada, salida o ambas) 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];

De repente, el NSNetServiceBrowser tarda casi un minuto en detectar que apagué el dispositivo
(lleva un minuto que se llame a didRemoveService ).

Los dispositivos con los que no me comunico (que abren las transmisiones) siguen llamando a didRemoveService tan pronto como los elimine.

Actualización: Aquí hay un poco más de información relacionada con mi problema.

Hice un seguimiento con Wireshark y noté lo siguiente:

Empiezo mi aplicación en el simulador de iPad, la aplicación inicia un navegador NSNetServiceBrowser y detecta la impresora. Después de eso, abre las transmisiones de entrada / salida al dispositivo (a través del aeropuerto express, usb). La impresora me envía actualizaciones de estado y cuando toco el botón de prueba en mi aplicación, la impresora comienza a imprimir. En Wireshark veo toda la comunicación con la impresora como se esperaba.

Ahora cuando empiezo exactamente la misma aplicación en el iPad (y dejo funcionando el simulador de iPad). La aplicación también inicia el NSNetServiceBrowser y detecta la impresora. La impresora no me envía actualizaciones de estado y cuando toco el botón de prueba, la impresora no está imprimiendo. En Wireshark veo la comunicación. La impresora o el aeropuerto recibe mis comandos y envía un paquete ACK.

Tan pronto como elimino la aplicación del simulador de iPad, la impresora comienza a imprimir los comandos que he enviado usando el iPad. Parece que abrir un socket bloquea todos los eventos bonjour, ¿cómo puedo evitar que esto suceda?

Más aquí: https://devforums.apple.com/message/541436


Estoy seguro de que In Lion, el controlador, ya no es convocado para el evento NSStreamEventEndEncountered. Por lo tanto, debe cerrar su flujo de entrada y eliminarlo del bucle cuando esté seguro de haber recibido todos los datos. Por ejemplo, cuando ocurre NSStreamEventHasBytesAvailable. Compruébalo y supongo que debería funcionar


Parece ser una limitación del Airport Express.

Mi implementación actual con GCDAsyncSocket funciona bastante bien y solo tengo que asegurarme de que solo se usa un socket para comunicarse con Airport Express.

Estoy cerrando la pregunta.