2010-02-14 10 views
5

Tengo un problema interesante con mi aplicación de prueba de socket.Socket de iPhone falla después de una gran cantidad de transferencias de datos

He configurado una toma de audición con una función AcceptCallback. He conectado a la toma de escucha usando:

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, 
            (CFStringRef) self.clientService.hostName, 
            self.clientService.port, 
            &myReadStream, 
            &myWriteStream); 

y he enviar datos al socket de escucha y la myReadStream myWriteStream, ambos de los cuales he echo a sus equivalentes NSStream.

El problema se produce después de enviar muchos paquetes de datos por separado. El tamaño de los paquetes no importa, es la cantidad de paquetes (o el número de creaciones de CFStreamCreatePairWithSocketToHost) que parece introducir el error.

después de enviar toneladas de paquetes (quizás alrededor de 100 o 200), cuando intento enviar datos a través de NSOutputStream consigo un error en la devolución de llamada NSStreamEvent:

Operation could not be completed. (NSUnknownErrorDomain error 8.)

Entonces, si trato de crear un nuevo servicio y publicarlo en la red Me sale un error cuando trato de resolver la nueva dirección. Me da un código de error de 10 en el NSNetService: método de delegado didNotResolve (también, la descripción del error está en blanco aquí).

Es casi como si el zócalo de escucha estuviera "lleno" pero parece pensar que está funcionando bien porque cuando miro CFSocketIsValid, devuelve verdadero.

Estoy perplejo y he pasado varias horas intentando depurar la situación ... ¿Alguien piensa en nadie? Gracias.

+0

Para agregar más combustible al fuego, sería útil enumerar los resultados que se ejecutan en el dispositivo real. El rendimiento de la red definitivamente varía entre lo físico y lo simulado. –

+0

Sí, he verificado que el mismo problema ocurre en el dispositivo también. Obtengo los mismos errores. Acabo de agregar un contador a la cantidad de conexiones que se están realizando antes de que falle, y hace 236 conexiones/transferencias exitosas. El 237o siempre falla. Está extrañamente cerca de 255, lo que me hace pensar que podría ser algún tipo de pérdida de memoria con las conexiones que retienen el socket. No estoy seguro ... – devinkb

+0

Más pistas: cuando la aplicación se ejecuta en el dispositivo, hay 239 transferencias exitosas. el 240o siempre falla. ¿Qué diferencias hay entre el socket en el iPhone y el socket en el simulador? – devinkb

Respuesta

2

Bien, descubrí el problema.

Cuando se conecta a una toma de corriente e inicializar una lectura y escritura corriente, al igual que con lo siguiente:

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef) self.clientService.hostName, self.clientService.port, &myInputStream, &myWriteStream); 

lo que necesita para asegurarse de que se establece la siguiente variable de manera que la corriente de nivel BSD inferior se cierra cuando se cierra la CFStream o NSStream (en mi caso me echaron la CFStream a un tipo NSStream):

CFReadStreamSetProperty(myReadStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); 
CFWriteStreamSetProperty(myWriteStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); 

Si no establece esta propiedad la corriente BSD en realidad nunca se cierra y se golpea una especie de número máximo de conexiones de socket - No estoy seguro de cuál es el problema.

Cuestiones relacionadas