2010-02-14 1 views
5

Ho un problema interessante con la mia applicazione di test socket.iPhone Socket non riesce dopo un gran numero di trasferimenti di dati

ho creato un socket in ascolto con una funzione AcceptCallback. Ho collegato alla presa di ascolto utilizzando:

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

e ho inviare i dati indietro al socket di ascolto della myReadStream e myWriteStream, entrambi i quali ho gettato ai loro equivalenti NSStream.

Il problema si verifica dopo l'invio di molti pacchetti di dati separati. Le dimensioni dei pacchetti non contano, è il numero di pacchetti (o il numero di creazioni CFStreamCreatePairWithSocketToHost) che sembra introdurre l'errore.

Dopo mando tonnellate di pacchetti (forse intorno a 100 o 200), quando provo a trasmettere dati attraverso la NSOutputStream ottengo un errore nella richiamata NSStreamEvent:

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

Poi, se cerco di creare un nuovo servizio e pubblicarlo sulla rete ottengo un errore quando provo a risolvere il nuovo indirizzo. Mi dà un codice di errore di 10 nel NSNetService: didNotResolve delegate method (anche, la descrizione dell'errore è vuota qui).

È quasi come se la presa di ascolto fosse "piena", ma sembra che funzioni correttamente, perché quando si verifica CFSocketIsValid restituisce true.

Sono perplesso e hanno trascorso diverse ore cercando di eseguire il debug della situazione ... Ogni pensiero a nessuno? Grazie.

+0

per aggiungere più benzina sul fuoco, sarebbe utile elencare i risultati in esecuzione sul dispositivo vero e proprio. Le prestazioni di rete variano decisamente tra il fisico e il simulato. –

+0

Sì, ho verificato che lo stesso problema si verifica anche sul dispositivo. Ottengo gli stessi errori. Ho appena aggiunto un contatore al numero di connessioni che sono state fatte prima che fallisca, e rende 236 connessioni/trasferimenti di successo. Il 237 ° fallisce sempre. È stranamente vicino a 255, il che mi fa pensare che potrebbe essere una sorta di perdita di memoria con le connessioni che mantengono il socket. Non sono sicuro ... – devinkb

+0

Altri indizi: quando l'applicazione è in esecuzione sul dispositivo, ci sono 239 trasferimenti riusciti. il 240 ° fallisce sempre. Quali differenze ci sono tra la presa sull'iPhone e la presa sul simulatore? – devinkb

risposta

2

OK, ho capito il problema.

Quando si collega ad una presa e l'inizializzazione di una lettura e scrittura flusso, come con il seguente:

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

è necessario assicurarsi di impostare la seguente variabile in modo che il flusso di livello BSD inferiore chiude quando si chiude la CFStream o NSStream (nel mio caso ho gettato il CFStream a un tipo NSStream):

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

Se non si imposta questa proprietà il flusso BSD chiude mai realmente e si colpisce una sorta di numero massimo di connessioni socket - Non sono sicuro di quale sia il problema.