2009-10-25 6 views
0

Je rencontre des problèmes avec une opération CFReadStream qui semble bloquer pendant une durée extrêmement longue après la dernière lecture. Je ne peux pas sembler voir quelque chose de mal avec ma logique. Je connecte mon readstream à un socket en utilisant la fonction CFStreamCreatePairWithSocketToCFHost. J'envoie une requête HTTP GET standard sur le port 80 en utilisant un flux d'écriture, puis j'essaie de charger le ReadStream dans un objet CFMTTHMessageRef. Je fais tout cela à partir d'un test unitaire que les barres vertes prennent mais pour toujours. Je suis certain que cela n'a rien à voir avec le serveur car je peux obtenir des réponses rapides en utilisant NSURLRequest en utilisant la même requête. Voici ma boucle qui pend:Blocs CFReadStreamRead lors de la dernière lecture

CFDataRef responseBody = CFDataCreateMutable(kCFAllocatorDefault, 0); 
    CFHTTPMessageRef myMessage = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, FALSE); 
    CFIndex blockReadSize = 1024; 
    UInt8 readBuffer[blockReadSize]; 
    NSLog(@"About to read stream..."); 
    CFIndex totoalRead = 0; 
    for(CFIndex bytesRead = CFReadStreamRead(readStream, readBuffer, blockReadSize); bytesRead > 0; bytesRead = CFReadStreamRead(readStream, readBuffer, blockReadSize)) { 
    totoalRead += bytesRead; 
    NSLog(@"Reading stream... %i bytes read.", bytesRead); 
    if (!CFHTTPMessageAppendBytes(myMessage, readBuffer, bytesRead)) { 
     //Parse error 
     NSLog(@"HTTP Read/Parse error!"); 
    }else{ 
     if (CFHTTPMessageIsHeaderComplete(myMessage)) { 
     // Perform processing. 
     NSLog(@"Header Complete"); 
     }else NSLog(@"Reading header"); 
    } 
    } 
    NSLog(@"Total bytes read %i", totoalRead); 
    responseBody = CFHTTPMessageCopyBody(myMessage); 

Il est à la dernière lecture qui renvoie zéro indiquant EOF qui se bloque pendant environ 1-3 minutes. Où vais-je mal?

Répondre

0

J'ai finalement compris cela. Je testais HTTP Pipelining via l'API réseau CF et parce que je ne fermais pas ma connexion serveur sur le flux d'écriture, la dernière lecture sur le flux en lecture bloquait parce que le socket était toujours ouvert et disponible pour plus de données serveur.

Questions connexes