NSStreamEventHasBytesAvailable ordentliche Lösung

  • NSStreamEventHasBytesAvailable ordentliche Lösung

    Hallo zusammen!

    Bräuchte eure Hilfe bei oben erwähnter Funktion. Im Grunde geht's darum das ich über IPhone mittels Socketverbindung auf einen Server zugreife und von dort Daten abhole.
    Wenn Daten ankommen werden diese mit NSStreamEventHasBytesAvailable in einer While Schleife eingelesen.

    Mein Problem ist jetzt, dass längere Datenstreams (oder auch kürzere bei langsameren Verbindungen) nicht als ganzes abgearbeitet werden, was bedeutet das die Whileschleife fertig ist, bevor das letzte Byte übertragen wurde.

    Momentan helfe ich mir damit, dass ich mittels "Sleep" Befehl das Einlesen künstlich hinauszögere um den ganzen Stream zu erhalten. Abfragen ob das "End of Stream" Zeichen angekommen ist kann ich in diesem Fall auch nicht da ich die zu übertragenden Daten verschlüsselt habe und dieses Zeichen erst nach dem Entschlüsseln als dieses erkannt wird.

    Quellcode

    1. case NSStreamEventHasBytesAvailable:
    2. if (theStream == inputStream) {
    3. uint8_t buffer[16384];
    4. int len;
    5. sleep(wartezeit1);
    6. while ([inputStream hasBytesAvailable]) {
    7. len = [inputStream read:buffer maxLength:sizeof(buffer)];
    8. if (len > 0) {
    9. NSString *output = [[[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]autorelease];
    10. if (nil != output) {[self messageReceived:output];}
    11. }
    12. }
    13. }
    14. break;
    Alles anzeigen



    hat jemand eine Idee?
  • 0815joe schrieb:


    hat jemand eine Idee?

    Das ist weniger eine Frage einer Idee, sondern des Wissens.

    Streams kommen aus Prinzip in kleinen Stückchen deren Länge nicht vorhersagbar ist. Das können sogar einzelne Bytes sein. Daher musst Du die Stückchen (jedes wird über ein eigenes NSStreamEventHasBytesAvailable gemeldet) erst zusammensetzen und wenn der Stream geschlossen wird (das ist ein anderes Event), das ganze Aufgesammelte verarbeiten.

    Was ich nicht verstehe ist warum Du von einer while-Schleife schreibst, die dann gar nicht da ist? Konzeptionell gibt es die schon, aber sie ist die Schleife von NSRunLoop, d.h. nicht explizit zu programmieren.