2010-02-14 5 views
5

Ich habe ein interessantes Problem mit meiner Socket-Test-Anwendung.iPhone Socket versagt nach einer großen Anzahl von Datenübertragungen

Ich habe einen abhörenden Socket mit einer AcceptCallback-Funktion eingerichtet. Ich habe mit an der Hörposition Buchse angeschlossen:

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

und ich habe Daten zurück an den Socket senden die myReadStream und myWriteStream, die ich beide auf ihre NSStream Äquivalente geworfen haben.

Das Problem tritt nach dem Senden vieler separater Datenpakete auf. Die Größe der Pakete spielt keine Rolle, es ist die Anzahl der Pakete (oder die Anzahl der CFStreamCreatePairWithSocketToHost-Kreationen), die den Fehler einzuführen scheinen.

Nachdem ich Tonnen von Paketen (vielleicht um die 100 oder 200) zu senden, wenn ich versuche, Daten über das NSOutputStream senden ich einen Fehler in dem NSStreamEvent Rückruf:

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

Dann, wenn ich versuche zu erstellen ein neuer Dienst und veröffentliche es im Netzwerk Ich erhalte einen Fehler, wenn ich versuche, die neue Adresse aufzulösen. Es gibt mir einen Fehlercode von 10 in der NSNetService: didNotResolve Delegate-Methode (auch hier ist die Fehlerbeschreibung leer).

Es ist fast so, als ob der abhörende Socket "voll" wäre, aber es scheint zu glauben, dass es gut funktioniert, denn wenn ich CFSocketIsValid überprüfe, wird es wahr.

Ich bin ratlos und habe mehrere Stunden damit verbracht, die Situation zu debuggen ... Irgendwelche Gedanken, irgendjemand? Vielen Dank.

+0

Um dem Feuer mehr Brennstoff hinzuzufügen, wäre es hilfreich, die Ergebnisse aufzulisten, die auf dem eigentlichen Gerät laufen. Die Netzwerkleistung variiert definitiv zwischen dem Physischen und dem Simulierten. –

+0

Ja, ich habe festgestellt, dass das gleiche Problem auch auf dem Gerät passiert. Ich bekomme die gleichen Fehler. Ich habe gerade einen Zähler zu der Anzahl der Verbindungen hinzugefügt, die gemacht werden, bevor es scheitert, und es macht 236 erfolgreiche Verbindungen/Übertragungen. Der 237. scheitert immer. Es ist merkwürdig nah an 255, was mich denken lässt, dass es eine Art von Speicherverlust mit den Socket-Halteverbindungen sein könnte. Nicht sicher ... – devinkb

+0

Weitere Hinweise: Wenn die Anwendung auf dem Gerät ausgeführt wird, gibt es 239 erfolgreiche Übertragungen. der 240ste scheitert immer. Welche Unterschiede gibt es zwischen der Steckdose am iPhone und der Steckdose am Simulator? – devinkb

Antwort

2

In Ordnung, ich habe das Problem herausgefunden.

Wenn an eine Steckdose angeschlossen und ein Lese- und Schreibstrom, wie bei den folgenden Initialisierung:

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

Sie sicher, dass Sie die folgende Variable vornehmen müssen so eingestellt, dass der untere Ebene BSD Strom, wenn schließen Sie schließen die CFStream oder NSStream (in meinem Fall warf ich die CFStream zu einem NSStream Typ):

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

Wenn Sie diese Eigenschaft nicht der BSD-Stream nie tatsächlich schließt und Sie treffen eine Art von max Anzahl der Socket-Verbindungen - nicht genau, was das Problem ist.

Verwandte Themen